PageSourceSearch

https://coasevilla.org/DXR.axd?r=1_9,1_10,1_253,1_21,1_62,1_11,1_12,1_13,1_180-iQKTr

js coasevilla.org collected 2026-10-02 10:28:18 UTC 548,313 bytes, 14,927 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-iQKTr';
12ASPx.EmptyImageUrl = '/DXR.axd?r=1_87-iQKTr';
13ASPx.VersionInfo = 'Version=\'23.2.3.0\', File Version=\'23.2.3.0\', Date Modified=\'03/12/2023 3:00:00\'';
14ASPx.Platform = 'ASP';
15ASPx.DoctypeMode = 'Html5';
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 http://www.devexpress.com/Support/Center/p/K18487.aspx.";
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
5666(function module(ASPx, options) {
5667ASPx.modules.Classes = module;
5668ASPx.classesScriptParsed = false;
5669ASPx.documentLoaded = false; 
5670ASPx.CallbackType = {
5671 Data: "d",
5672 Common: "c"
5673};
5674ASPx.callbackState = {
5675 aborted: "aborted",
5676 inTurn: "inTurn",
5677 sent: "sent"
5678};
5679var ASPxClientEvent = ASPx.CreateClass(null, {
5680 constructor: function() {
5681  this.handlerInfoList = [];
5682  this.firingIndex = -1;
5683 },
5684 AddHandler: function(handler, executionContext) {
5685  if(typeof(executionContext) == "undefined")
5686   executionContext = null;
5687  this.RemoveHandler(handler, executionContext);
5688  var handlerInfo = ASPxClientEvent.CreateHandlerInfo(handler, executionContext);
5689  this.handlerInfoList.push(handlerInfo);
5690 },
5691 RemoveHandler: function(handler, executionContext) {
5692  this.removeHandlerByCondition(function(handlerInfo) {
5693   return handlerInfo.handler == handler && 
5694    (!executionContext || handlerInfo.executionContext == executionContext);
5695  });
5696 },
5697 removeHandlerByCondition: function(predicate) {
5698   for(var i = this.handlerInfoList.length - 1; i >= 0; i--) {
5699   var handlerInfo = this.handlerInfoList[i];
5700   if(predicate(handlerInfo)) {
5701    ASPx.Data.ArrayRemoveAt(this.handlerInfoList, i);
5702    if(i <= this.firingIndex)
5703     this.firingIndex--;
5704   }
5705  }
5706 },
5707 removeHandlerByControlName: function(controlName) {
5708  this.removeHandlerByCondition(function(handlerInfo) {
5709   return handlerInfo.executionContext &&  
5710    handlerInfo.executionContext.name === controlName;
5711  });
5712 },
5713 ClearHandlers: function() {
5714  this.handlerInfoList.length = 0;
5715 },
5716 FireEvent: function(obj, args) {
5717  for(this.firingIndex = 0; this.firingIndex < this.handlerInfoList.length; this.firingIndex++) {
5718   var handlerInfo = this.handlerInfoList[this.firingIndex];
5719   handlerInfo.handler.call(handlerInfo.executionContext, obj, args);
5720  }
5721 },
5722 InsertFirstHandler: function(handler, executionContext){
5723  if(typeof(executionContext) == "undefined")
5724   executionContext = null;
5725  var handlerInfo = ASPxClientEvent.CreateHandlerInfo(handler, executionContext);
5726  ASPx.Data.ArrayInsert(this.handlerInfoList, handlerInfo, 0);
5727 },
5728 IsEmpty: function() {
5729  return this.handlerInfoList.length == 0;
5730 }
5731});
5732ASPxClientEvent.CreateHandlerInfo = function(handler, executionContext) {
5733 return {
5734  handler: handler,
5735  executionContext: executionContext
5736 };
5737};
5738var ASPxClientEventArgs = ASPx.CreateClass(null, {
5739 constructor: function() {
5740 }
5741});
5742ASPxClientEventArgs.Empty = new ASPxClientEventArgs();
5743var ASPxClientCancelEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
5744 constructor: function(){
5745  this.constructor.prototype.constructor.call(this);
5746  this.cancel = false;
5747 }
5748});
5749var ASPxClientProcessingModeEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
5750 constructor: function(processOnServer){
5751  this.constructor.prototype.constructor.call(this);
5752  this.processOnServer = !!processOnServer;
5753 }
5754});
5755var ASPxClientProcessingModeCancelEventArgs = ASPx.CreateClass(ASPxClientProcessingModeEventArgs, {
5756 constructor: function(processOnServer){
5757  this.constructor.prototype.constructor.call(this, processOnServer);
5758  this.cancel = false;
5759 }
5760});
5761var OrderedMap = ASPx.CreateClass(null, {
5762 constructor: function(){
5763  this.entries = {};
5764  this.firstEntry = null;
5765  this.lastEntry = null;
5766 },
5767 add: function(key, element) {
5768  var entry = this.addEntry(key, element);
5769  this.entries[key] = entry;
5770 },
5771 remove: function(key) {
5772  var entry = this.entries[key];
5773  if(entry === undefined)
5774   return;
5775  this.removeEntry(entry);
5776  delete this.entries[key];
5777 },
5778 clear: function() {
5779  this.markAllEntriesAsRemoved();
5780  this.entries = {};
5781  this.firstEntry = null;
5782  this.lastEntry = null;
5783 },
5784 get: function(key) {
5785  var entry = this.entries[key];
5786  return entry ? entry.value : undefined;
5787 },
5788 forEachEntry: function(processFunc, context) {
5789  context = context || this;
5790  for(var entry = this.firstEntry; entry; entry = entry.next) {
5791   if(entry.removed)
5792    continue;
5793   if(processFunc.call(context, entry.key, entry.value))
5794    return;
5795  }
5796 },
5797 addEntry: function(key, element) {
5798  var entry = { key: key, value: element, next: null, prev: null };
5799  if(!this.firstEntry)
5800   this.firstEntry = entry;
5801  else {
5802   entry.prev = this.lastEntry;
5803   this.lastEntry.next = entry;
5804  }
5805  this.lastEntry = entry;
5806  return entry;
5807 },
5808 removeEntry: function(entry) {
5809  if(this.firstEntry == entry)
5810   this.firstEntry = entry.next;
5811  if(this.lastEntry == entry)
5812   this.lastEntry = entry.prev;
5813  if(entry.prev)
5814   entry.prev.next = entry.next;
5815  if(entry.next)
5816   entry.next.prev = entry.prev;
5817  entry.removed = true;
5818 },
5819 markAllEntriesAsRemoved: function() {
5820  for(var entry = this.firstEntry; entry; entry = entry.next)
5821   entry.removed = true;
5822 }
5823});
5824var CollectionBase = ASPx.CreateClass(null, {
5825 constructor: function(){
5826  this.elementsMap = new OrderedMap();
5827  this.isASPxClientCollection = true;
5828 },
5829 Add: function(key, element) {
5830  this.elementsMap.add(key, element);
5831 },
5832 Remove: function(key) {
5833  this.elementsMap.remove(key);
5834 },
5835 Clear: function(){
5836  this.elementsMap.clear();
5837 },
5838 Get: function(key){
5839  return this.elementsMap.get(key);
5840 }
5841});
5842(function garbageCollector(ASPx, options) {
5843 ASPx.modules.garbageCollector = garbageCollector;
5844 var interval = options.GCCheckInterval;
5845 window.setInterval(collectObjects, interval);
5846 function canCollectObjects() {
5847  if (!ASPx.GetControlCollection) return false;
5848  var collection = ASPx.GetControlCollection();
5849  return collection && !collection.InCallback();
5850 }
5851 function collectObjects() {
5852  if (!canCollectObjects()) return;
5853  ASPx.GetControlCollectionCollection().RemoveDisposedControls();
5854  if(typeof(ASPx.GetStateController) != "undefined")
5855   ASPx.GetStateController().RemoveDisposedItems();
5856  if(ASPx.TableScrollHelperCollection)
5857   ASPx.TableScrollHelperCollection.RemoveDisposedObjects();
5858  if(ASPx.Ident.scripts.ASPxClientRatingControl)
5859   ASPxClientRatingControl.RemoveDisposedElementUnderCursor();
5860  var postHandler = ASPx.GetPostHandler();
5861  if(postHandler)
5862   postHandler.RemoveDisposedFormsFromCache();
5863 }
5864})(ASPx, options);
5865var ControlTree = ASPx.CreateClass(null, {
5866 constructor: function(controlCollection, container, controlFilter) {
5867  this.container = container;
5868  this.domMap = { };
5869  this.rootNode = this.createNode(null, null);
5870  this.createControlTree(controlCollection, container, controlFilter);
5871 },
5872 createControlTree: function(controlCollection, container, controlFilter) {
5873  controlCollection.ProcessControlsInContainer(container, function(control) {
5874   control.RegisterInControlTree(this);
5875  }.aspxBind(this), controlFilter);
5876  var fixedNodes = [];
5877  var fixedNodesChildren = [];
5878  for(var domElementID in this.domMap) {
5879   if(!this.domMap.hasOwnProperty(domElementID)) continue;
5880   var node = this.domMap[domElementID];
5881   var controlOwner = node.control ? node.control.controlOwner : null;
5882   if(controlOwner && this.domMap[controlOwner.name])
5883    continue;
5884   if(this.isFixedNode(node))
5885    fixedNodes.push(node);
5886   else {
5887    var parentNode = this.findParentNode(domElementID);
5888    parentNode = parentNode || this.rootNode;
5889    if(this.isFixedNode(parentNode))
5890     fixedNodesChildren.push(node);
5891    else {
5892     var childNode = node.mainNode || node;
5893     this.addChildNode(parentNode, childNode);
5894    }
5895   }
5896  }
5897  for(var i = fixedNodes.length - 1; i >= 0; i--)
5898   this.insertChildNode(this.rootNode, fixedNodes[i], 0);
5899  for(var i = fixedNodesChildren.length - 1; i >= 0; i--)
5900   this.insertChildNode(this.rootNode, fixedNodesChildren[i], 0);
5901 },
5902 findParentNode: function(id) {
5903  var element = document.getElementById(id).parentNode;
5904  while(element && element.tagName !== "BODY") {
5905   if(element.id) {
5906    var parentNode = this.domMap[element.id];
5907    if(parentNode)
5908     return parentNode;
5909   }
5910   element = element.parentNode;
5911  }
5912  return null;
5913 },
5914 addChildNode: function(node, childNode) {
5915  if(!childNode.parentNode) {
5916   node.children.push(childNode);
5917   childNode.parentNode = node;
5918  }
5919 },
5920 insertChildNode: function(node, childNode, index) {
5921  if(!childNode.parentNode) {
5922   ASPx.Data.ArrayInsert(node.children, childNode, index);
5923   childNode.parentNode = node;
5924  }
5925 },
5926 addRelatedNode: function(node, relatedNode) {
5927  this.addChildNode(node, relatedNode);
5928  relatedNode.mainNode = node;
5929 },
5930 isFixedNode: function(node) {
5931  var control = node.mainNode ? node.mainNode.control : node.control;
5932  return control && control.HasFixedPosition();
5933 },
5934 createNode: function(domElementID, control) {
5935  var node = {
5936   control: control,
5937   children: [],
5938   parentNode: null,
5939   mainNode: null
5940  };
5941  if(domElementID)
5942   this.domMap[domElementID] = node;
5943  return node;
5944 }
5945});
5946var ControlAdjuster = ASPx.CreateClass(null, {
5947 constructor: function() {
5948 },
5949 adjustControlsInHierarchy: function(controlCollection, adjustFunc, container, collapseControls, controlFilter) {
5950  var controlTree = new ASPx.ControlTree(controlCollection, container, controlFilter);
5951  this.adjustControlsInTree(controlTree.rootNode, adjustFunc, container, collapseControls);
5952 },
5953 adjustControlsInTree: function(treeNode, adjustFunc, container, collapseControls) {
5954  var observer = _aspxGetDomObserver();
5955  observer.pause(container, true);
5956  var documentScrollInfo;
5957  if(collapseControls) {
5958   documentScrollInfo = ASPx.GetOuterScrollPosition(document.body);
5959   this.collapseControls(treeNode);
5960  }
5961  var adjustNodes = [], 
5962   autoHeightNodes = [];
5963  var requireReAdjust = this.forEachControlCore(treeNode, collapseControls, adjustFunc, adjustNodes, autoHeightNodes);
5964  if(requireReAdjust)
5965   this.forEachControlsBackward(adjustNodes, collapseControls, adjustFunc);
5966  else {
5967   for(var i = 0, node; node = autoHeightNodes[i]; i++)
5968    node.control.AdjustAutoHeight();
5969  }
5970  if(collapseControls)
5971   ASPx.RestoreOuterScrollPosition(documentScrollInfo);
5972  observer.resume(container, true);
5973 },
5974 forEachControlCore: function(node, collapseControls, processFunc, adju
5974stNodes, autoHeightNodes) {
5975  var requireReAdjust = false,
5976   size, newSize;
5977  if(node.control) {
5978   var checkReadjustment = collapseControls && node.control.IsControlCollapsed() && node.control.CanCauseReadjustment();
5979   if(checkReadjustment)
5980    size = node.control.GetControlPercentMarkerSize(false, true);
5981   if(node.control.IsControlCollapsed() && !node.control.IsExpandableByAdjustment())
5982    node.control.ExpandControl();
5983   node.control.isInsideHierarchyAdjustment = true;
5984   processFunc(node.control);
5985   node.control.isInsideHierarchyAdjustment = false;
5986   if(checkReadjustment) {
5987    newSize = node.control.GetControlPercentMarkerSize(false, true);
5988    requireReAdjust = size.width !== newSize.width;
5989   }
5990   if(node.control.sizingConfig.supportAutoHeight)
5991    autoHeightNodes.push(node);
5992   node.control.ResetControlPercentMarkerSize();
5993  }
5994  for(var childNode, i = 0; childNode = node.children[i]; i++)
5995   requireReAdjust = this.forEachControlCore(childNode, collapseControls, processFunc, adjustNodes, autoHeightNodes) || requireReAdjust;
5996  adjustNodes.push(node);
5997  return requireReAdjust;
5998 },
5999 forEachControlsBackward: function(adjustNodes, collapseControls, processFunc) {
6000  for(var i = 0, node; node = adjustNodes[i]; i++)
6001   this.forEachControlsBackwardCore(node, collapseControls, processFunc);
6002 },
6003 forEachControlsBackwardCore: function(node, collapseControls, processFunc) {
6004  if(node.control)
6005   processFunc(node.control);
6006  if(node.children.length > 1) {
6007   for(var i = 0, childNode; childNode = node.children[i]; i++) {
6008    if(childNode.control)
6009     processFunc(childNode.control);
6010   }
6011  }
6012 },
6013 collapseControls: function(node) {
6014  for(var childNode, i = 0; childNode = node.children[i]; i++)
6015   this.collapseControls(childNode);
6016  if(node.control && node.control.NeedCollapseControl())
6017   node.control.CollapseControl();
6018 }
6019});
6020var controlAdjuster = null;
6021function GetControlAdjuster() {
6022 if(!controlAdjuster)
6023  controlAdjuster = new ControlAdjuster();
6024 return controlAdjuster;
6025}
6026function _aspxFunctionIsInCallstack(currentCallee, targetFunction, depthLimit) {
6027 var candidate = currentCallee;
6028 var depth = 0;
6029 while(candidate && depth <= depthLimit) {
6030  candidate = candidate.caller;
6031  if(candidate == targetFunction)
6032   return true;
6033  depth++;
6034 }
6035 return false;
6036}
6037ASPx.attachToReady(aspxClassesWindowOnLoad);
6038function aspxClassesWindowOnLoad(){
6039 ASPx.documentLoaded = true;
6040 _aspxMoveLinkElements();
6041 _aspxSweepDuplicatedLinks();
6042 ResourceManager.SynchronizeResources();
6043 var externalScriptProcessor = GetExternalScriptProcessor();
6044 if(externalScriptProcessor)
6045  externalScriptProcessor.ShowErrorMessages();
6046 ASPx.AccessibilityUtils.initialize();
6047 ASPx.GetControlCollection().Initialize();
6048 _aspxInitializeScripts();
6049 _aspxInitializeLinks();
6050 _aspxInitializeFocus();
6051 ASPx.GetControlCollection().FinalizeInitialization();
6052}
6053Ident = { };
6054Ident.IsDate = function(obj) {
6055 return obj && (obj.constructor == Date || obj.constructor.name == "Date");
6056};
6057Ident.IsRegExp = function(obj) {
6058 return obj && obj.constructor === RegExp;
6059};
6060Ident.IsArray = function(obj) {
6061 return obj && obj.constructor == Array;
6062};
6063Ident.IsASPxClientCollection = function(obj) {
6064 return obj && obj.isASPxClientCollection;
6065};
6066Ident.IsASPxClientControl = function(obj) {
6067 return obj && obj instanceof ASPxClientControlBase;
6068};
6069Ident.IsASPxClientEdit = function(obj) {
6070 return obj && obj.isASPxClientEdit;
6071};
6072Ident.IsFocusableElementRegardlessTabIndex = function (element) {
6073 var tagName = element.tagName;
6074 return tagName == "TEXTAREA" || tagName == "INPUT" || tagName == "A" ||
6075  tagName == "SELECT" || tagName == "IFRAME" || tagName == "OBJECT" || tagName == "BUTTON";
6076};
6077Ident.isDialogInvisibleControl = function(control) {
6078 return !!ASPx.Dialog && ASPx.Dialog.isDialogInvisibleControl(control);
6079};
6080Ident.isBatchEditUnusedEditor = function(control) {
6081 return !!ASPx.BatchEditHelper && ASPx.BatchEditHelper.isBatchEditUnusedEditor(control);
6082};
6083Ident.scripts = {};
6084if(ASPx.IsFunction(window.WebForm_InitCallbackAddField)) {
6085 (function() {
6086  var original = window.WebForm_InitCallbackAddField;
6087  window.WebForm_InitCallbackAddField = function(name, value) {
6088   if(typeof(name) == "string" && name)
6089    original.apply(null, arguments);
6090  };
6091 })();
6092}
6093ASPx.FireDefaultButton = function(evt, buttonID) {
6094 if(_aspxIsDefaultButtonEvent(evt, buttonID)) {
6095  var defaultButton = ASPx.GetElementById(buttonID);
6096  if(defaultButton && defaultButton.click) {
6097   if(ASPx.IsFocusable(defaultButton))
6098    defaultButton.focus();
6099   ASPx.Evt.DoElementClick(defaultButton);
6100   ASPx.Evt.PreventEventAndBubble(evt);
6101   return false;
6102  }
6103 }
6104 return true;
6105};
6106function _aspxIsDefaultButtonEvent(evt, defaultButtonID) {
6107 if(evt.keyCode != ASPx.Key.Enter)
6108  return false;
6109 var srcElement = ASPx.Evt.GetEventSource(evt);
6110 if(!srcElement || srcElement.id === defaultButtonID)
6111  return true;
6112 var tagName = srcElement.tagName;
6113 var type = srcElement.type;
6114 return tagName != "TEXTAREA" && tagName != "BUTTON" && tagName != "A" &&
6115  (tagName != "INPUT" || type != "checkbox" && type != "radio" && type != "button" && type != "submit" && type != "reset");
6116}
6117var PostHandler = ASPx.CreateClass(null, {
6118 constructor: function() {
6119  this.Post = new ASPxClientEvent();
6120  this.PostFinalization = new ASPxClientEvent();
6121  this.observableForms = [];
6122  this.dxCallbackTriggers = {};
6123  this.lastSubmitElementName = null;
6124  this.beforeOnSubmit = function() { };
6125  this.ReplaceGlobalPostFunctions();
6126  this.HandleDxCallbackBeginning();
6127  this.HandleMSAjaxRequestBeginning();
6128 },
6129 Update: function() {
6130  this.ReplaceFormsSubmit(true);
6131 },
6132 ProcessPostRequest: function(ownerID, isCallback, isMSAjaxRequest, isDXCallback) {
6133  this.cancelPostProcessing = false;
6134  this.isMSAjaxRequest = isMSAjaxRequest;
6135  if(this.SkipRaiseOnPost(ownerID, isCallback, isDXCallback))
6136   return;
6137  var args = new PostHandlerOnPostEventArgs(ownerID, isCallback, isMSAjaxRequest, isDXCallback);
6138  this.Post.FireEvent(this, args);
6139  this.cancelPostProcessing = args.cancel;
6140  if(!args.cancel)
6141   this.PostFinalization.FireEvent(this, args);
6142 },
6143 SkipRaiseOnPost: function(ownerID, isCallback, isDXCallback) { 
6144  if(!isCallback)
6145   return false;
6146  var dxOwner = isDXCallback && ASPx.GetControlCollection().GetByName(ownerID);
6147  if(dxOwner) {
6148   this.dxCallbackTriggers[dxOwner.uniqueID] = true;
6149   return false;
6150  }
6151  if(this.dxCallbackTriggers[ownerID]) {
6152   this.dxCallbackTriggers[ownerID] = false;
6153   return true;
6154  }
6155  return false;
6156 },
6157 ReplaceGlobalPostFunctions: function() {
6158  if(ASPx.IsFunction(window.__doPostBack))
6159   this.ReplaceDoPostBack();
6160  if(ASPx.IsFunction(window.WebForm_DoCallback))
6161   this.ReplaceDoCallback();
6162  if(ASPx.IsFunction(window.WebForm_ExecuteCallback))
6163   this.ReplaceExecuteCallback();
6164  this.ReplaceFormsSubmit();
6165 },
6166 HandleDxCallbackBeginning: function() {
6167  ASPx.GetControlCollection().BeforeInitCallback.AddHandler(function(s, e) {
6168   aspxRaisePostHandlerOnPost(e.callbackOwnerID, true, false, true); 
6169  });
6170 },
6171 HandleMSAjaxRequestBeginning: function() {
6172  var pageRequestManager = ASPx.GetMSAjaxRequestManager();
6173  if(pageRequestManager != null && Ident.IsArray(pageRequestManager._onSubmitStatements)) {
6174   pageRequestManager._onSubmitStatements.unshift(function() {
6175    var postbackSettings = Sys.WebForms.PageRequestManager.getInstance()._postBackSettings;
6176    var postHandler = aspxGetPostHandler();
6177    aspxRaisePostHandlerOnPost(postbackSettings.asyncTarget, true, true);
6178    return !postHandler.cancelPostProcessing;
6179   });
6180  }
6181 },
6182 ReplaceDoPostBack: function() {
6183  var original = __doPostBack;
6184  __doPostBack = function(eventTarget, eventArgument) {
6185   var postHandler = aspxGetPostHandler();
6186   aspxRaisePostHandlerOnPost(eventTarget);
6187   if(postHandler.cancelPostProcessing)
6188    return;
6189   ASPxClientControl.postHandlingLocked = true;
6190   original(eventTarget, eventArgument);
6191   delete ASPxClientControl.postHandlingLocked;
6192  };
6193 },
6194 ReplaceDoCallback: function() {
6195  var original = WebForm_DoCallback;
6196  WebForm_DoCallback = function(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) {
6197   var postHandler = aspxGetPostHandler();
6198   aspxRaisePostHandlerOnPost(eventTarget, true);
6199   if(postHandler.cancelPostProcessing)
6200    return;
6201   return original(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync);
6202  };
6203 },
6204 ReplaceExecuteCallback: function() {
6205  var original = WebForm_ExecuteCallback;
6206  var handler = this;
6207  WebForm_ExecuteCallback = function(callbackObject) {
6208   var isDxCallback = callbackObject && callbackObject.context && ASPx.GetControlCollection().Get(callbackObject.context) !== null;
6209   ASPx.callbackProcessed = false;
6210   original(callbackObject);
6211   if(ASPx.Browser.Firefox && document.getElementById("__EVENTVALIDATION")) {
6212    var viewStateField = document.getElementById("__VIEWSTATE");
6213    if(viewStateField) {
6214     var response = callbackObject.xmlRequest.responseText;
6215     var separatorIndex = response.indexOf("|");
6216     var validationFieldLength = separatorIndex > 0 ? response.substring(0, separatorIndex) : null;
6217     if(ASPx.IsNumber(validationFieldLength))
6218      viewStateField.value = viewStateField.value; 
6219    }
6220   }
6221   if(isDxCallback && !ASPx.callbackProcessed) {
6222    var request = callbackObject.xmlRequest;
6223    if(ASPxClientUtils.IsExists(callbackObject.eventCallback)) {
6224     if (handler.HasAppErrorOnCallback(request))
6225      callbackObject.eventCallback(handler.GetServerErrorText(), callbackObject.context);
6226     else if (handler.HasNetworkErrorOnCallback(request))
6227      callbackObject.eventCallback(handler.GetNetworkError(), callbackObject.context);
6228    }
6229   }
6230  };
6231 },
6232 HasAppErrorOnCallback: function(request) {
6233  if(!request) return false;
6234  var isServerError = request.status && request.status == 500;
6235  var pattern = /<html[^>]*>([\w|\W]*)<\/html>/im;
6236  var text = request.responseText;
6237  return isServerError && !!text && pattern.test(text);
6238 },
6239 GetServerErrorText: function() {
6240  return "Internal Server Error";
6241 },
6242 HasNetworkErrorOnCallback: function(request) {
6243  if (!request) return false;
6244  return request.readyState == 4 && request.status == 0;
6245 },
6246 GetNetworkError: function() {
6247  return new NetworkError();
6248 },
6249 ReplaceFormsSubmit: function(checkObservableCollection) {
6250  for(var i = 0; i < document.forms.length; i++) { 
6251   var form = document.forms[i];
6252   if(checkObservableCollection && ASPx.Data.ArrayIndexOf(this.observableForms, form) >= 0)
6253    continue;
6254   if(form.submit)
6255    this.ReplaceFormSubmit(form);
6256   this.ReplaceFormOnSumbit(form);
6257   this.observableForms.push(form);
6258  }
6259 },
6260 ReplaceFormSubmit: function(form) {
6261  var originalSubmit = form.submit;
6262  form.submit = function() {
6263   var postHandler = aspxGetPostHandler();
6264   aspxRaisePostHandlerOnPost();
6265   if(postHandler.cancelPostProcessing)
6266    return false;
6267   var callee = arguments.callee;
6268   this.submit = originalSubmit;
6269   var submitResult = this.submit();
6270   this.submit = callee;
6271   return submitResult;
6272  };
6273  form = null;
6274 },
6275 ReplaceFormOnSumbit: function(form) {
6276  var originalSubmit = form.onsubmit;
6277  form.onsubmit = function() {
6278   var postHandler = aspxGetPostHandler();
6279   postHandler.beforeOnSubmit();
6280   if(postHandler.isMSAjaxRequest)
6281    postHandler.isMsAjaxRequest = false;
6282   else
6283    aspxRaisePostHandlerOnPost(postHandler.GetLastSubmitElementName());
6284   if(postHandler.cancelPostProcessing)
6285    return false;
6286   return ASPx.IsFunction(originalSubmit)
6287    ? originalSubmit.apply(this, arguments)
6288    : true;
6289  };
6290  form = null;
6291 },
6292 SetBeforeOnSubmit: function(action) {
6293  this.beforeOnSubmit = action;
6294 },
6295 SetLastSubmitElementName: function(elementName) {
6296  this.lastSubmitElementName = elementName;
6297 },
6298 GetLastSubmitElementName: function() {
6299  return this.lastSubmitElementName;
6300 },
6301 RemoveDisposedFormsFromCache: function(){
6302  for(var i = 0; this.observableForms && i < this.observableForms.length; i++){
6303   var form = this.observableForms[i];
6304   if(!ASPx.IsExistsElement(form)){
6305    ASPx.Data.ArrayRemove(this.observableForms, form);
6306    i--;
6307   }
6308  }
6309 }
6310});
6311var NetworkError = ASPx.CreateClass(null, {
6312 constructor: function () {
6313  this.message = "Network Error";
6314 }
6315});
6316function aspxRaisePostHandlerOnPost(ownerID, isCallback, isMSAjaxRequest, isDXCallback) {
6317 if(ASPxClientControl.postHandlingLocked) return;
6318 var postHandler = aspxGetPostHandler();
6319 if(postHandler)
6320  postHandler.ProcessPostRequest(ownerID, isCallback, isMSAjaxRequest, isDXCallback);
6321}
6322var aspxPostHandler;
6323function aspxGetPostHandler() {
6324 if(!aspxPostHandler)
6325  aspxPostHandler = new PostHandler();
6326 return aspxPostHandler;
6327}
6328var PostHandlerOnPostEventArgs = ASPx.CreateClass(ASPxClientCancelEventArgs, {
6329 constructor: function(ownerID, isCallback, isMSAjaxCallback, isDXCallback){
6330  this.constructor.prototype.constructor.call(this);
6331  this.ownerID = ownerID;
6332  this.isCallback = !!isCallback;
6333  this.isDXCallback = !!isDXCallback;
6334  this.isMSAjaxCallback = !!isMSAjaxCallback;
6335 }
6336});
6337var ResourceManager = {
6338 HandlerStr: "DXR.axd?r=",
6339 ResourceHashes: {},
6340 SynchronizeResources: function(method){
6341  if(!method){
6342   method = function(name, resource) { 
6343    this.UpdateInputElements(name, resource); 
6344   }.aspxBind(this);
6345  }
6346  var resources = this.GetResourcesData();
6347  for(var name in resources)
6348   if(resources.hasOwnProperty(name))
6349    method(name, resources[name]);
6350 },
6351 GetResourcesData: function(){
6352  return {
6353   DXScript: this.GetResourcesElementsString(_aspxGetIncludeScripts(), "src", "DXScript"),
6354   DXCss: this.GetResourcesElementsString(_aspxGetLinks(), "href", "DXCss")
6355  };
6356 },
6357 ParseBundleSrc: function(elements, urlAttr){
6358  var timeStamp = "";
6359  var resourceUrlArray = [];
6360  for(var i = 0; i < elements.length; i++) {
6361   var resourceUrl = ASPx.Attr.GetAttribute(elements[i], urlAttr);
6362   if(resourceUrl) {
6363    var pos = resourceUrl.indexOf(this.HandlerStr);
6364    if(pos > -1){
6365     var list = resourceUrl.substr(pos + this.HandlerStr.length);
6366     var ampPos = list.lastIndexOf("-");
6367     if(ampPos > -1) {
6368      timeStamp = list.substr(ampPos);
6369      list = list.substr(0, ampPos);
6370     }
6371     var indexes = list.split(",");
6372     for(var j = 0; j < indexes.length; j++) {
6373      resourceUrlArray.push(indexes[j]);
6374     }
6375    }
6376    else
6377     resourceUrlArray.push(resourceUrl);
6378   }
6379  }
6380  return {
6381   'resourceUrlArray': resourceUrlArray,
6382   'timeStamp': timeStamp
6383  };
6384 },
6385 GetResourceHashes: function (id) {
6386  if (!this.ResourceHashes[id])
6387   this.ResourceHashes[id] = {};
6388  return this.ResourceHashes[id];
6389 },
6390 GetResourcesElementsString: function (elements, urlAttr, id) {
6391  var hash = this.GetResourceHashes(id);
6392  var resourceUrlArray = this.ParseBundleSrc(elements, urlAttr).resourceUrlArray;
6393  for(var i = 0; i < resourceUrlArray.length; i++) {
6394   hash[resourceUrlArray[i]] = resourceUrlArray[i];
6395  }
6396  var array = [];
6397  for(var key in hash)
6398   if(hash.hasOwnProperty(key))
6399    array.push(key);
6400  return array.join(",");
6401 },
6402 GetNewResourcesElementString: function (element, urlAttr, id) {
6403  var originalUrl = ASPx.Attr.GetAttribute(element, urlAttr);
6404  var handlerStrIndex = originalUrl.indexOf(this.HandlerStr);
6405  var dxResources = handlerStrIndex > -1;
6406  if(!dxResources) return element[urlAttr];
6407  var hash = this.GetResourceHashes(id);
6408  var srcInfo = this.ParseBundleSrc([element], urlAttr);
6409  var resourceUrlArray = srcInfo.resourceUrlArray;
6410  var timeStamp = srcInfo.timeStamp;
6411  var newResourceArray = [];
6412  for(var i = 0; i < resourceUrlArray.length; i++) {
6413    if(!hash[resourceUrlArray[i]])
6414    newResourceArray.push(resourceUrlArray[i]);
6415  }
6416  var newResources = "";
6417  if(newResourceArray.length > 0) {
6418   var baseUrl = originalUrl.substr(0, handlerStrIndex);
6419   newResources = baseUrl + this.HandlerStr + newResourceArray.join(",") + timeStamp;
6420  }
6421  return newResources;
6422 },
6423 UpdateInputElements: function(typeName, list){
6424  for(var i = 0; i < document.forms.length; i++){
6425   var inputElement = document.forms[i][typeName];
6426   if(!inputElement)
6427    inputElement = this.CreateInputElement(document.forms[i], typeName);
6428   inputElement.value = list;
6429  }
6430 },
6431 CreateInputElement: function(form, typeName){
6432  var inputElement = ASPx.CreateHiddenField(typeName);
6433  form.appendChild(inputElement);
6434  return inputElement;
6435 }
6436};
6437ASPx.includeScriptPrefix = "dxis_";
6438ASPx.startupScriptPrefix = "dxss_";
6439var includeScriptsCache = {};
6440var createdIncludeScripts = [];
6441var appendedScriptsCount = 0;
6442var callbackOwnerNames = [];
6443var scriptsRestartHandlers = { };
6444function _aspxIsKnownIncludeScript(script) {
6445 return !!includeScriptsCache[script.src];
6446}
6447function _aspxCacheIncludeScript(script) {
6448 includeScriptsCache[script.src] = 1;
6449}
6450function _aspxProcessScriptsAndLinks(ownerName, isCallback) {
6451 if(!ASPx.documentLoaded) return; 
6452 _aspxProcessScripts(ownerName, isCallback);
6453 getLinkProcessor().process();
6454 ASPx.ClearCachedCssRules();
6455}
6456function _aspxGetStartupScripts(container) {
6457 return _aspxGetScriptsCore(ASPx.startupScriptPrefix, container);
6458}
6459function _aspxGetIncludeScripts() {
6460 return _aspxGetScriptsCore(ASPx.includeScriptPrefix);
6461}
6462function _aspxGetScriptsCore(prefix, container) {
6463 var result = [];
6464 var scripts;
6465 if(ASPx.IsExists(container))
6466  scripts = ASPx.GetNodesByTagName(container, "SCRIPT");
6467 else
6468  scripts = document.getElementsByTagName("SCRIPT");
6469 for(var i = 0; i < scripts.length; i++) {
6470  if(scripts[i].id.indexOf(prefix) == 0)
6471   result.push(scripts[i]);
6472 }
6473 return result;
6474}
6475function _aspxIsResourceLink(link) {
6476 if(typeof link !== "string")
6477  link = link.href;
6478 return link.toLowerCase().indexOf(ResourceManager.HandlerStr.toLowerCase()) >= 0;
6479}
6480function _aspxGetLinks(allLinks) {
6481 var result = [];
6482 var links = document.getElementsByTagName("LINK");
6483 for(var i = 0; i < links.length; i++) {
6484  if(allLinks || _aspxIsResourceLink(links[i]))
6485   result.push(links[i]);
6486 }
6487 return result;
6488}
6489function _aspxIsLinksLoaded() {
6490 var links = _aspxGetLinks(true);
6491 for(var i = 0, link; link = links[i]; i++)
6492  if(link.readyState && link.readyState.toLowerCase() == "loading")
6493    return false;
6494 return true;
6495}
6496function _aspxInitializeLinks() {
6497 var links = _aspxGetLinks(true);
6498 for(var i = 0; i < links.length; i++)
6499  links[i].loaded = true; 
6500}
6501var scriptExecutedAttrName = "data-executed";
6502var scriptDelayedExecutionAttrName = "data-dx-delayedeval";
6503ASPx.MarkInnerScriptBlocksAsDelayedExecution = function(scriptsContainer) {
6504 var scripts = scriptsContainer.querySelectorAll("script[id^=" + ASPx.startupScriptPrefix + "]");
6505 for(var i = 0; i < scripts.length; i++)
6506  ASPx.Attr.SetAttribute(scripts[i], scriptDelayedExecutionAttrName, true);
6507};
6508function isScriptExecuted(script) {
6509 return ASPx.Attr.GetAttribute(script, scriptExecutedAttrName);
6510}
6511function markScriptAsExecuted(script) {
6512 if(ASPx.Attr.GetAttribute(script, scriptDelayedExecutionAttrName))
6513  ASPx.Attr.RemoveAttribute(script, scriptDelayedExecutionAttrName);
6514 else
6515  ASPx.Attr.SetAttribute(script, scriptExecutedAttrName, true);
6516}
6517function _aspxInitializeScripts() {
6518 var scripts = _aspxGetIncludeScripts();
6519 for(var i = 0; i < scripts.length; i++)
6520  _aspxCacheIncludeScript(scripts[i]);   
6521 var startupScripts = _aspxGetStartupScripts();
6522 for(var i = 0; i < startupScripts.length; i++)
6523  markScriptAsExecuted(startupScripts[i]);
6524}
6525function _aspxSweepDuplicatedLinks() {
6526 var hash = { };
6527 var links = _aspxGetLinks();
6528 for(var i = 0; i < links.length; i++) {
6529  var href = links[i].href;
6530  if(!href)
6531   continue;
6532  if(hash[href]){
6533   if(!hash[href].loaded && links[i].loaded) {
6534    ASPx.RemoveElement(hash[href]);
6535    hash[href] = links[i];
6536   }
6537   else
6538    ASPx.RemoveElement(links[i]);
6539  }
6540  else
6541   hash[href] = links[i];
6542 }
6543}
6544function _aspxSweepDuplicatedScripts() {
6545 var hash = { };
6546 var scripts = _aspxGetIncludeScripts();
6547 for(var i = 0; i < scripts.length; i++) {
6548  var src = scripts[i].src;
6549  if(!src) continue;
6550  if(hash[src])
6551   ASPx.RemoveElement(scripts[i]);
6552  else
6553   hash[src] = scripts[i];
6554 }
6555}
6556function _aspxAreScriptsEqual(script1, script2) {
6557 return script1.src == script2.src;
6558}
6559function _aspxProcessScripts(ownerName, isCallback) {
6560 var scripts = _aspxGetIncludeScripts();
6561 var previousCreatedScript = null;
6562 var firstCreatedScript = null;
6563 for(var i = 0; i < scripts.length; i++) {
6564  var script = scripts[i];
6565  if(script.src == "") continue; 
6566  if(_aspxIsKnownIncludeScript(script))
6567   continue;
6568  var getOnlyNewResources = true;
6569  var onlyNewScripts = ResourceManager.GetNewResourcesElementString(script, "src", "DXScript", getOnlyNewResources);
6570  if (onlyNewScripts == "")
6571   continue;
6572  var createdScript = document.createElement("script");
6573  ASPx.Attr.AppendScriptType(createdScript);
6574  createdScript.src = onlyNewScripts;
6575  createdScript.id = script.id;
6576  if(ASPx.Data.ArrayIndexOf(createdIncludeScripts, createdScript, _aspxAreScriptsEqual) >= 0)
6577   continue;
6578  createdIncludeScripts.push(createdScript);
6579  ASPx.RemoveElement(script);
6580  if(ASPx.Browser.Edge || ASPx.Browser.WebKitFamily || (ASPx.Browser.Firefox && ASPx.Browser.Version >= 4) || ASPx.Browser.IE) {
6581   createdScript.onload = new Function("ASPx.OnScriptLoadCallback(this, " + isCallback + ");");
6582   if(firstCreatedScript == null)
6583    firstCreatedScript = createdScript;
6584   createdScript.nextCreatedScript = null;
6585   if(previousCreatedScript != null)
6586    previousCreatedScript.nextCreatedScript = createdScript;
6587   previousCreatedScript = createdScript;
6588  } else {
6589   createdScript.onload = new Function("ASPx.OnScriptLoadCallback(this);");
6590   ASPx.AppendScript(createdScript);
6591   _aspxCacheIncludeScript(createdScript);
6592  }
6593 }
6594 if(firstCreatedScript != null) {
6595  ASPx.AppendScript(firstCreatedScript);
6596  _aspxCacheIncludeScript(firstCreatedScript);
6597 }
6598 if(isCallback)
6599  callbackOwnerNames.push(ownerName);
6600 if(createdIncludeScripts.length == 0) {
6601  var newLinks = ASPx.GetNodesByTagName(document.body, "link");
6602  var needProcessLinks = isCallback && newLinks.length > 0;
6603  if(needProcessLinks)
6604   needProcessLinks = getLinkProcessor().addLinks(newLinks);
6605  if(!needProcessLinks)
6606   ASPx.FinalizeScriptProcessing(isCallback);
6607 }
6608}
6609ASPx.FinalizeScriptProcessing = function(isCallback) {
6610 createdIncludeScripts = [];
6611 appendedScriptsCount = 0;
6612 var linkProcessor = getLinkProcessor();
6613 if(linkProcessor.hasLinks())
6614  _aspxSweepDuplicatedLinks();
6615 linkProcessor.reset();
6616 _aspxSweepDuplicatedScripts();
6617 ResourceManager.SynchronizeResources();
6618 _aspxRunStartupScripts(isCallback);
6619};
6620var startupScriptsRunning = false;
6621function _aspxRunStartupScripts(isCallback, container) {
6622 startupScriptsRunning = true;
6623 try {
6624  _aspxRunStartupScriptsCore(container);
6625 }
6626 finally {
6627  startupScriptsRunning = false;
6628 }
6629 if(ASPx.documentLoaded) {
6630  ASPx.GetControlCollection().ProcessActionByPredicate(
6631   function(collection) { collection.InitializeElements(isCallback); },
6632   function(control) { return !ASPx.IsExists(container) || ASPx.GetIsParent(container, control.GetMainElement()); }
6633  );
6634  for(var key in scriptsRestartHandlers)
6635   if(scriptsRestartHandlers.hasOwnProperty(key))
6636    scriptsRestartHandlers[key]();
6637  if(isCallback)
6638   _aspxRunEndCallbackScript();
6639 }
6640}
6641function _aspxIsStartupScriptsRunning(isCallback) {
6642 return startupScriptsRunning;
6643}
6644function _aspxRunStartupScriptsCore(container) {
6645 var scripts = _aspxGetStartupScripts(container);
6646 var code;
6647 for(var i = 0; i < scripts.length; i++){
6648  var script = scripts[i];
6649  if(!isScriptExecuted(script)) {
6650   _aspxEnsureStartupScriptIsUnique(script.id); 
6651   code = ASPx.GetScriptCode(script);
6652   eval(code);
6653   markScriptAsExecuted(script);
6654  }
6655 }
6656}
6657function _aspxEnsureStartupScriptIsUnique(scriptId) {
6658 if(!scriptId)
6659  return;
6660 var scriptExecutedSelector = "script[" + scriptExecutedAttrName + "='true']#" + scriptId;
6661 ASPx.RemoveElement(document.querySelector(scriptExecutedSelector));
6662}
6663function _aspxRunEndCallbackScript() {
6664 while(callbackOwnerNames.length > 0) {
6665  var callbackOwnerName = callbackOwnerNames.pop();
6666  var callbackOwner = ASPx.GetControlCollection().Get(callbackOwnerName);
6667  if(callbackOwner)
6668   callbackOwner.DoEndCallback();
6669 }
6670}
6671ASPx.RunStartupScriptsCreatedOnClient = function(container) {
6672 _aspxRunStartupScriptsCore(container);
6673};
6674ASPx.OnScriptReadyStateChangedCallback = function(scriptElement, isCallback) {
6675 if(scriptElement.readyState == "loaded") {
6676  _aspxCacheIncludeScript(scriptElement);
6677  for(var i = 0; i < createdIncludeScripts.length; i++) {
6678   var script = createdIncludeScripts[i];
6679   if(_aspxIsKnownIncludeScript(script)) {
6680    if(!isScriptExecuted(script)) {
6681     markScriptAsExecuted(script);
6682     ASPx.AppendScript(script);
6683     appendedScriptsCount++;
6684    }
6685   } else
6686    break;
6687  }
6688  if(createdIncludeScripts.length == appendedScriptsCount)
6689   ASPx.FinalizeScriptProcessing(isCallback);
6690 }
6691};
6692ASPx.OnScriptLoadCallback = function(scriptElement, isCallback) {
6693 appendedScriptsCount++;
6694 if(scriptElement.nextCreatedScript) {
6695  ASPx.AppendScript(scriptElement.nextCreatedScript);
6696  _aspxCacheIncludeScript(scriptElement.nextCreatedScript);
6697 }
6698 if(createdIncludeScripts.length == appendedScriptsCount)
6699  ASPx.FinalizeScriptProcessing(isCallback);
6700};
6701function _aspxAddScriptsRestartHandler(objectName, handler) {
6702 scriptsRestartHandlers[objectName] = handler;
6703}
6704function _aspxMoveLinkElements() {
6705 var head = ASPx.GetNodesByTagName(document, "head")[0];
6706 var bodyLinks = ASPx.GetNodesByTagName(document.body, "link");
6707 if(head && bodyLinks.length > 0){
6708  var headLinks = ASPx.GetNodesByTagName(head, "link");
6709  var dxLinkAnchor = head.firstChild;
6710  for(var i = 0; i < headLinks.length; i++){
6711   if(_aspxIsResourceLink(headLinks[i]))
6712    dxLinkAnchor = headLinks[i].nextSibling;
6713  }
6714  while(bodyLinks.length > 0) 
6715   head.insertBefore(bodyLinks[0], dxLinkAnchor);
6716 }
6717}
6718var LinkProcessor = ASPx.CreateClass(null, {
6719 constructor: function() {
6720  this.linkInfos = [];
6721  this.loadingObservationTimerID = -1;
6722 },
6723 process: function() {
6724  if(this.hasLinks()) {
6725   if(this.isLinkLoadEventSupported())
6726    this.processViaLoadEvent();
6727   else
6728    this.processViaTimer();
6729  }
6730  else
6731   _aspxSweepDuplicatedLinks();
6732  _aspxMoveLinkElements();
6733 },
6734 addLinks: function(links) {
6735  var prevLinkCount = this.linkInfos.length;
6736  for(var i = 0; i < links.length; i++) {
6737   var link = links[i];
6738   if(link.loaded || link.rel != "stylesheet" || !_aspxIsResourceLink(link))
6739    continue;
6740   var linkInfo = {
6741    link: link,
6742    href: link.href
6743   };
6744   this.linkInfos.push(linkInfo);
6745  }
6746  return prevLinkCount != this.linkInfos.length;
6747 },
6748 hasLinks: function() {
6749  return this.linkInfos.length > 0;
6750 },
6751 reset: function() {
6752  this.linkInfos = [];
6753 },
6754 processViaLoadEvent: function() {
6755  for(var i = 0, linkInfo; linkInfo = this.linkInfos[i]; i++)
6756   linkInfo.link.onload = this.onLinkLoad.bind(this);
6757 },
6758 isLinkLoadEventSupported: function() {
6759  return !(ASPx.Browser.Chrome && ASPx.Browser.MajorVersion < 19 || ASPx.Browser.Firefox && ASPx.Browser.MajorVersion < 9 ||
6760   ASPx.Browser.Safari && ASPx.Browser.MajorVersion < 6 || ASPx.Browser.AndroidDefaultBrowser && ASPx.Browser.MajorVersion < 4.4);
6761 },
6762 processViaTimer: function() {
6763  if(this.loadingObservationTimerID == -1)
6764   this.onLinksLoadingObserve();
6765 },
6766 onLinksLoadingObserve: function() {
6767  if(this.getIsAllLinksLoaded()) {
6768   this.loadingObservationTimerID = -1;
6769   this.onAllLinksLoad();
6770  }
6771  else
6772   this.loadingObservationTimerID = window.setTimeout(this.onLinksLoadingObserve.aspxBind(this), 100);
6773 },
6774 getIsAllLinksLoaded: function() {
6775  var styleSheets = document.styleSheets;
6776  var loadedLinkHrefs = { };
6777  for(var i = 0; i < styleSheets.length; i++) {
6778   var styleSheet = styleSheets[i];
6779   try {
6780    if(styleSheet.cssRules)
6781     loadedLinkHrefs[styleSheet.href] = 1;
6782   }
6783   catch(ex) { }
6784  }
6785  var loadedLinksCount = 0;
6786  for(var i = 0, linkInfo; linkInfo = this.linkInfos[i]; i++) {
6787   if(loadedLinkHrefs[linkInfo.href])
6788    loadedLinksCount++;
6789  }
6790  return loadedLinksCount == this.linkInfos.length;
6791 },
6792 onAllLinksLoad: function() {
6793  this.reset();
6794  _aspxSweepDuplicatedLinks();
6795  if(createdIncludeScripts.length == 0)
6796   ASPx.FinalizeScriptProcessing(true);
6797 },
6798 onLinkReadyStateChanged: function(linkElement) {
6799  if(linkElement.readyState == "complete")
6800   this.onLinkLoadCore(linkElement);
6801 },
6802 onLinkLoad: function(evt) {
6803  var linkElement = ASPx.Evt.GetEventSource(evt);
6804  this.onLinkLoadCore(linkElement);
6805 },
6806 onLinkLoadCore: function(linkElement) {
6807  var linkInfo = this.getLinkInfo(linkElement);
6808  if(!linkInfo) return;
6809  linkInfo.loaded = true;
6810  var notLoadedLinks = this.linkInfos.filter(function(info) { return !info.loaded; });
6811  if(notLoadedLinks.length == 0)
6812   this.onAllLinksLoad();
6813 },
6814 getLinkInfo: function(linkElement) {
6815  for(var i = 0, linkInfo; linkInfo = this.linkInfos[i]; i++) {
6816   if(linkInfo.link == linkElement)
6817    return linkInfo;
6818  }
6819 }
6820});
6821var linkProcessor = null;
6822function getLinkProcessor() {
6823 if(linkProcessor == null)
6824  linkProcessor = new LinkProcessor();
6825 return linkProcessor;
6826}
6827ASPx.LinkProcessor = LinkProcessor;
6828var IFrameHelper = ASPx.CreateClass(null, {
6829 constructor: function(params) {
6830  this.params = params || {};
6831  this.params.src = this.params.src || "";
6832  this.CreateElements();
6833 },
6834 CreateElements: function() {
6835  var elements = IFrameHelper.Create(this.params);
6836  this.containerElement = elements.container;
6837  this.iframeElement = elements.iframe;
6838  this.AttachOnLoadHandler(this, this.iframeElement);
6839  this.SetLoading(true);
6840  if(this.params.onCreate)
6841   this.params.onCreate(this.containerElement, this.iframeElement);
6842 },
6843 AttachOnLoadHandler: function(instance, element) {
6844  ASPx.Evt.AttachEventToElement(element, "load", function() {
6845   instance.OnLoad(element);
6846  });
6847 },
6848 OnLoad: function(element) {
6849  this.SetLoading(false, element);
6850  if(!element.preventCustomOnLoad && this.params.onLoad)
6851   this.params.onLoad();
6852 },
6853 IsLoading: function(element) {
6854  element = element || this.iframeElement;
6855  if(element)
6856   return element.loading;
6857  return false;
6858 },
6859 SetLoading: function(value, element) {
6860  element = element || this.iframeElement;
6861  if(element)
6862   element.loading = value;
6863 },
6864 GetContentUrl: function() {
6865  return this.params.src;
6866 },
6867 SetContentUrl: function(url, preventBrowserCaching) {
6868  if(url) {
6869   this.params.src = url;
6870   if(preventBrowserCaching)
6871    url = IFrameHelper.AddRandomParamToUrl(url);
6872   this.SetLoading(true);
6873   this.iframeElement.src = url;
6874  }
6875 },
6876 RefreshContentUrl: function() {
6877  if(this.IsLoading())
6878   return;
6879  this.SetLoading(true);
6880  var oldContainerElement = this.containerElement;
6881  var oldIframeElement = this.iframeElement;
6882  var postfix = "_del" + Math.floor(Math.random()*100000).toString();
6883  if(this.params.id)
6884   oldIframeElement.id = this.params.id + postfix;
6885  if(this.params.name)
6886   oldIframeElement.name = this.params.name + postfix;
6887  ASPx.SetStyles(oldContainerElement, { height: 0 });
6888  this.CreateElements();
6889  oldIframeElement.preventCustomOnLoad = true;
6890  oldIframeElement.src = ASPx.BlankUrl;
6891  window.setTimeout(function() {
6892   oldContainerElement.parentNode.removeChild(oldContainerElement);
6893  }, 10000); 
6894 }
6895});
6896IFrameHelper.Create = function(params) {
6897 var iframeHtmlStringParts = [ "<iframe frameborder='0'" ];
6898 if(params) {
6899  if(params.id)
6900   iframeHtmlStringParts.push(" id='", params.id, "'");
6901  if(params.name)
6902   iframeHtmlStringParts.push(" name='", params.name, "'");
6903  if(params.title)
6904   iframeHtmlStringParts.push(" title='", params.title, "'");
6905  if(params.scrolling)
6906   iframeHtmlStringParts.push(" scrolling='", params.scrolling, "'");
6907  if(params.src)
6908   iframeHtmlStringParts.push(" src='", params.src, "'");
6909 }
6910 iframeHtmlStringParts.push("></iframe>");
6911 var containerElement = ASPx.CreateHtmlElementFromString("<div style='border-width: 0px; padding: 0px; margin: 0px'></div>");
6912 var iframeElement = ASPx.CreateHtmlElementFromString(iframeHtmlStringParts.join(""));
6913 containerElement.appendChild(iframeElement);
6914 return {
6915  container: containerElement,
6916  iframe: iframeElement
6917 };
6918};
6919IFrameHelper.AddRandomParamToUrl = function(url) {
6920 var prefix = url.indexOf("?") > -1
6921  ? "&"
6922  : "?";
6923 var param = prefix + Math.floor(Math.random()*100000).toString();
6924 var anchorIndex = url.indexOf("#");
6925 return anchorIndex == -1
6926  ? url + param
6927  : url.substr(0, anchorIndex) + param + url.substr(anchorIndex);
6928};
6929IFrameHelper.GetWindow = function(name) {
6930 var frameElement = document.getElementById(name);
6931 return (frameElement != null) ? frameElement.contentWindow : null;
6932};
6933IFrameHelper.GetDocument = function(name) {
6934 var frameElement = document.getElementById(name);
6935 return (frameElement != null) ? frameElement.contentDocument : null;
6936};
6937IFrameHelper.GetDocumentBody = function(name) {
6938 var doc = IFrameHelper.GetDocument(name);
6939 return (doc != null) ? doc.body : null;
6940};
6941IFrameHelper.GetDocumentHead = function (name) {
6942 var doc = IFrameHelper.GetDocument(name);
6943 return (doc != null) ? doc.head || doc.getElementsByTagName('head')[0] : null;
6944};
6945IFrameHelper.GetElement = function(name) {
6946 return document.getElementById(name);
6947};
6948var KbdHelper = ASPx.CreateClass(null, {
6949 constructor: function(control) {
6950  this.control = control;
6951  this.ready = false;
6952  this.clickHandler = this.HandleClick.bind(this);
6953  this.focusHandler = this.onElementFocus.bind(this);
6954  this.blurHandler = this.onBlur.bind(this);
6955 },
6956 Init: function() {
6957  if(!this.ready){
6958   KbdHelper.GlobalInit();
6959   var elements = this.getFocusableElements();
6960   for(var i = 0; i < elements.length; i++) {
6961    var element = elements[i];
6962    element.tabIndex = Math.max(element.tabIndex, 0);
6963    ASPx.Evt.AttachEventToElement(element, "click", this.clickHandler);
6964    ASPx.Evt.AttachEventToElement(element, "focus", this.focusHandler);
6965    ASPx.Evt.AttachEventToElement(element, "blur", this.blurHandler);
6966   }
6967   this.ready = true;
6968  }
6969 },
6970 Dispose: function() {
6971  if(this.ready) {
6972   var elements = this.getFocusableElements();
6973   for(var i = 0; i < elements.length; i++) {
6974    var element = elements[i];
6975    element.tabIndex = -1;
6976    ASPx.Evt.DetachEventFromElement(element, "click", this.clickHandler);
6977    ASPx.Evt.DetachEventFromElement(element, "focus", this.focusHandler);
6978    ASPx.Evt.DetachEventFromElement(element, "blur", this.blurHandler);
6979   }
6980   this.ready = false;
6981  }
6982 },
6983 onElementFocus: function(e) {
6984  if(!this.CanFocus(e))
6985   return true;
6986  KbdHelper.active = this;
6987 },
6988 getFocusableElements: function() {
6989  return [this.GetFocusableElement()]; 
6990 },
6991 GetFocusableElement: function() { return this.control.GetMainElement(); },
6992 canHandleNoFocusAction: function() { 
6993  var focusableElements = this.getFocusableElements();
6994  for(var i = 0; i < focusableElements.length; i++) {
6995   if(focusableElements[i] === _aspxGetFocusedElement())
6996    return false;
6997  }
6998  return true;
6999 },
7000 RequirePreventScrollOnFocus: function() { return false; },
7001 CanFocus: function(e) {
7002  var tag = ASPx.Evt.GetEventSource(e).tagName;
7003  return !(tag === "A" || tag === "TEXTAREA" || tag === "INPUT" || tag === "SELECT" || tag === "IFRAME" || tag === "OBJECT");
7004 },
7005 HandleClick: function(e) {
7006  if(!this.CanFocus(e))
7007   return;
7008  this.Focus();
7009 },
7010 Focus: function() {
7011  var preventScroll = this.RequirePreventScrollOnFocus();
7012  var savedDocumentScrollTop = preventScroll ? ASPx.GetDocumentScrollTop() : -1;
7013  try {
7014   this.GetFocusableElement().focus({ preventScroll: preventScroll });
7015  } catch(e) { }
7016  if(preventScroll && !this.IsNativePreventScrollOnFocusSupported() && savedDocumentScrollTop !== ASPx.GetDocumentScrollTop())
7017   ASPx.SetDocumentScrollTop(savedDocumentScrollTop);
7018 },
7019 IsNativePreventScrollOnFocusSupported: function() {
7020  if(this.isNativePreventScrollOnFocusSupported === undefined)
7021   this.isNativePreventScrollOnFocusSupported = this.CalcIsNativePreventScrollOnFocusSupported();
7022  return this.isNativePreventScrollOnFocusSupported;
7023 },
7024 CalcIsNativePreventScrollOnFocusSupported: function() {
7025  var result = false;
7026  try {
7027   ASPx.GetActiveElement().focus(Object.defineProperty({}, "preventScroll", { get: function() { result = true; } }));
7028  } catch(e) { result = false; }
7029  return result;
7030 },
7031 onBlur: function(){
7032  delete KbdHelper.active;
7033 },
7034 HandleKeyDown: function(e) { }, 
7035 HandleKeyPress: function(e) { }, 
7036 HandleKeyUp: function (e) { },
7037 HandleNoFocusAction: function(e) { },
7038 FocusByAccessKey: function () { }
7039});
7040KbdHelper.GlobalInit = function() {
7041 if(KbdHelper.ready)
7042  return;
7043 ASPx.Evt.AttachEventToDocument("keydown", KbdHelper.OnKeyDown);
7044 ASPx.Evt.AttachEventToDocument("keypress", KbdHelper.OnKeyPress);
7045 ASPx.Evt.AttachEventToDocument("keyup", KbdHelper.OnKeyUp);
7046 KbdHelper.ready = true; 
7047};
7048KbdHelper.swallowKey = false;
7049KbdHelper.accessKeys = { };
7050KbdHelper.ProcessKey = function(e, actionName) {
7051 if(!KbdHelper.active) 
7052  return;
7053 if (KbdHelper.active.canHandleNoFocusAction()) {
7054  KbdHelper.active["HandleNoFocusAction"](e, actionName);
7055  return;
7056 }
7057 var ctl = KbdHelper.active.control;
7058 if(ctl !== ASPx.GetControlCollection().Get(ctl.name)) {
7059  delete KbdHelper.active;
7060  return;
7061 }
7062 if(!KbdHelper.swallowKey) 
7063  KbdHelper.swallowKey = KbdHelper.active[actionName](e);
7064 if(KbdHelper.swallowKey)
7065  ASPx.Evt.PreventEvent(e);
7066};
7067KbdHelper.OnKeyDown = function(e) {
7068 KbdHelper.swallowKey = false;
7069 if(KbdHelper.TryAccessKey(KbdHelper.getKeyName(e)))
7070  ASPx.Evt.PreventEvent(e);
7071 else 
7072  KbdHelper.ProcessKey(e, "HandleKeyDown"); 
7073};
7074KbdHelper.OnKeyPress = function(e) { KbdHelper.ProcessKey(e, "HandleKeyPress"); };
7075KbdHelper.OnKeyUp = function(e) { KbdHelper.ProcessKey(e, "HandleKeyUp"); };
7076KbdHelper.RegisterAccessKey = function(obj) {
7077 var key;
7078 if(obj.accessKey)
7079  key = "CtrlShift" + obj.accessKey;
7080 else if(obj.keyTipModeShortcut)
7081  key = obj.keyTipModeShortcut;
7082 if(!key) return;
7083 KbdHelper.accessKeys[key.toLowerCase()] = obj.name;
7084};
7085KbdHelper.TryAccessKey = function(code) {
7086 var key = code.toLowerCase ? code.toLowerCase() : String.fromCharCode(code).toLowerCase();
7087 var name = KbdHelper.accessKeys[key];
7088 if(!name) return false;
7089 var obj = ASPx.GetControlCollection().Get(name);
7090 return KbdHelper.ClickAccessKey(obj);
7091};
7092KbdHelper.ClickAccessKey = function (control) {
7093 if (!control) return false;
7094 var el = control.GetMainElement();
7095 if (!el) return false;
7096 el.focus();
7097 setTimeout(function () {
7098  if (KbdHelper.active && KbdHelper.active.FocusByAccessKey)
7099   KbdHelper.active.FocusByAccessKey();
7100 }.aspxBind(this), ASPx.FOCUS_TIMEOUT);
7101 return true;
7102};
7103KbdHelper.getKeyName = function(e) {
7104 var name = "";
7105 if(e.altKey)
7106  name += "Alt";
7107 if(e.ctrlKey)
7108  name += "Ctrl";
7109 if(e.shiftKey)
7110  name += "Shift";
7111 var keyCode = e.key || e.code || String.fromCharCode(ASPx.Evt.GetKeyCode(e));
7112 if(keyCode.match(/key/i))
7113  name += keyCode.replace(/key/i, "");
7114 else if(keyCode.match(/digit/i))
7115  name += keyCode.replace(/digit/i, "");
7116 else if(keyCode.match(/arrow/i))
7117  name += keyCode.replace(/arrow/i, "");
7118 else if(keyCode.match(/ins/i))
7119  name += "Ins";
7120 else if(keyCode.match(/del/i))
7121  name += "Del";
7122 else if(keyCode.match(/back/i))
7123  name += "Back";
7124 else if(!keyCode.match(/alt/i) && !keyCode.match(/control/i) && !keyCode.match(/shift/i))
7125  name += keyCode;
7126 return name.replace(/^a-zA-Z0-9/, "");
7127};
7128AccessKeysHelper = ASPx.CreateClass(KbdHelper, {
7129 constructor: function (control) {
7130  this.constructor.prototype.constructor.call(this, control);
7131  this.accessKeysVisible = false;
7132  this.activeKey = null;
7133  this.accessKey = control.createAccessKey ? control.createAccessKey(control.accessKey) : new AccessKey(control.accessKey);
7134  this.accessKeys = this.accessKey.accessKeys;
7135  this.charIndex = 0;
7136  this.onFocusByAccessKey = null;
7137  this.onClose = null;
7138  this.manualStopProcessing = false;
7139  this.isActive = false;
7140  this.areAccessKeysShown = false;
7141 },
7142 Init: function (control) {
7143  KbdHelper.prototype.Init.call(this);
7144  KbdHelper.RegisterAccessKey(control);   
7145 },
7146 Add: function (accessKey) {
7147  this.accessKey.Add(accessKey);
7148 },
7149 HandleKeyDown: function (e) {
7150  var keyCode = ASPx.Evt.GetKeyCode(e);
7151  var stopProcessing = this.processKeyDown(keyCode);
7152  if (stopProcessing.value) {
7153   this.stopProcessing();
7154   if(this.onClosedOnEscape && (keyCode == ASPx.Key.Esc || stopProcessing.fireEvent))
7155    this.onClosedOnEscape();
7156  }
7157  return stopProcessing;
7158 },
7159 HandleNoFocusAction: function (e, actionName) {
7160  var keyCode = ASPx.Evt.GetKeyCode(e);
7161  if (this.onClosedOnEscape && keyCode == ASPx.Key.Esc && actionName == "HandleKeyDown")
7162   this.onClosedOnEscape();
7163 },
7164 Activate: function () {
7165  KbdHelper.ClickAccessKey(this.control);
7166  this.areAccessKeysShown = true;
7167 },
7168 Stop: function() {
7169  this.stopProcessing();
7170 },
7171 stopProcessing: function () {
7172  this.HideAccessKeys();
7173  if (KbdHelper.active && this.isActive) {
7174   this.isActive = false;
7175   KbdHelper.active.control.GetMainElement().blur();
7176   delete KbdHelper.active;
7177  }
7178 },
7179 onBlur: function() {
7180  if (this.manualStopProcessing) {
7181   this.manualStopProcessing = false;
7182   return;
7183  }
7184  this.HideAccessKeys();
7185  KbdHelper.prototype.onBlur.call(this);
7186 },
7187 processKeyDown: function (keyCode) {
7188  switch (keyCode) {
7189   case ASPx.Key.Left:
7190    this.TryMoveFocusLeft();
7191    return { value: false };
7192   case ASPx.Key.Right:
7193    this.TryMoveFocusRight();
7194    return { value: false };
7195   case ASPx.Key.Esc:
7196    if(this.control.hideAllPopups)
7197     this.control.hideAllPopups(true, true);
7198    if(this.activeKey)
7199     this.activeKey = this.activeKey.Return();
7200    this.charIndex = 0;
7201    if (!this.activeKey)
7202     return { value: true };
7203    break;
7204   case ASPx.Key.Enter:
7205    return { value: true };
7206   default:
7207    if (!ASPx.IsPrintableKey(keyCode))
7208     return { value: false };
7209    var char = String.fromCharCode(keyCode).toUpperCase();
7210    var needToContinue = { value: false };
7211    var keyResult;
7212    if(this.activeKey)
7213     keyResult = this.activeKey.TryAccessKey(char, this.charIndex, needToContinue);
7214    if (needToContinue.value) {
7215     this.charIndex++;
7216     return { value: false };
7217    }
7218    this.charIndex = 0;
7219    if(keyResult !== undefined)
7220     this.activeKey = keyResult;
7221    else
7222     return { value: true, fireEvent: true };
7223    if (!this.activeKey || !this.activeKey.accessKeys || this.activeKey.accessKeys.length == 0) {
7224     if (this.activeKey && this.activeKey.manualStopProcessing) {
7225      this.manualStopProcessing = true;
7226      break;
7227     }
7228     return { value: true, fireEvent: true };
7229    }
7230  }
7231  return { value: false };
7232 },
7233 TryMoveFocusLeft: function (modifier) {},
7234 TryMoveFocusRight: function (modifier) {},
7235 TryMoveFocusUp: function (modifier) {},
7236 TryMoveFocusDown: function (modifier) {},
7237 FocusByAccessKey: function() {
7238  if (this.onFocusByAccessKey)
7239   this.onFocusByAccessKey();
7240  this.HideAccessKeys();
7241  KbdHelper.prototype.FocusByAccessKey.call(this);
7242  this.activeKey = this.accessKey;
7243  this.activeKey.execute();
7244  this.isActive = true;
7245  this.areAccessKeysShown = true;
7246 },
7247 HideAccessKeys: function() {
7248  this.areAccessKeysShown = false;
7249  this.hideAccessKeys(this.accessKey);
7250 },
7251 Update: function() {
7252  this.throttleMethod(this.refresh, 100);
7253 },
7254 refresh: function() {
7255  if(this.activeKey && this.areAccessKeysShown) {
7256   this.activeKey.execute();
7257  }
7258 },
7259 throttleMethod: function(method, delay) {
7260  clearTimeout(method.timerId);
7261  method.timerId = setTimeout(function() {
7262   method.call(this);
7263  }.aspxBind(this), delay);
7264 },
7265 AreAccessKeysShown: function() {
7266  return this.areAccessKeysShown;
7267 },
7268 hideAccessKeys: function (accessKey) {
7269  for (var i = 0, ak; ak = accessKey.accessKeys[i]; i++) {
7270   this.hideAccessKeys(ak);
7271  }
7272  if (accessKey)
7273   accessKey.hide();
7274 },
7275 HandleClick: function(e) {
7276  KbdHelper.prototype.HandleClick.call(this, e);
7277  this.stopProcessing();
7278 }
7279});
7280AccessKey = ASPx.CreateClass(null, {
7281 constructor: function (popupItem, getPopupElement, keyTipElement, key, onlyClick, manualStopProcessing) {
7282  this.key = key ? key : keyTipElement ? ASPxClientUtils.Trim(ASPx.GetInnerText(keyTipElement)) : null;
7283  this.popupItem = popupItem;
7284  this.getPopupElement = getPopupElement;
7285  this.keyTipElement = keyTipElement;
7286  this.accessKeys = [];
7287  this.needShowChilds = true;
7288  this.parent = null;
7289  this.onlyClick = onlyClick;
7290  this.manualStopProcessing = manualStopProcessing;
7291 },
7292 Add: function (accessKey) {
7293  this.accessKeys.push(accessKey);
7294  accessKey.parent = this;
7295 },
7296 TryAccessKey: function (char, index, needToContinue) {
7297  if (!this.accessKeys || this.accessKeys.length == 0)
7298   return;
7299  for (var i = 0, accessKey; accessKey = this.accessKeys[i]; i++) {
7300   if (accessKey.key[index] == char && accessKey.isVisible()) {
7301    if (accessKey.key[index + 1]) {
7302     needToContinue.value = true;
7303    }
7304    else {
7305     accessKey.execute();
7306     return accessKey;
7307    }
7308   } else {
7309    accessKey.hide();
7310   }
7311  }
7312  for (var i = 0, accessKey; accessKey = this.accessKeys[i]; i++) {
7313   var key = accessKey.TryAccessKey(char, index, needToContinue);
7314   if (key)
7315    return key;
7316  }
7317  return;
7318 },
7319 isVisible: function(){
7320  return ASPx.GetElementVisibility(this.keyTipElement);
7321 },
7322 Return: function () {
7323  this.hideChildAccessKeys();
7324  if (this.parent) {
7325   this.parent.showAccessKeys(true);
7326  }  
7327  return this.parent;
7328 },
7329 execute: function () {
7330  this.hideAll();
7331  if (this.popupItem && this.popupItem.accessKeyClick && !this.onlyClick)
7332   this.popupItem.accessKeyClick();
7333  if (this.getPopupElement && this.onlyClick)
7334   ASPx.Evt.EmulateMouseClick(this.getPopupElement(this.popupItem));
7335  if (this.accessKeys)
7336   setTimeout(function () {
7337    this.showAccessKeys(true);
7338   }.aspxBind(this), 100);
7339 },
7340 showAccessKeys: function(directShow) {
7341  if (!directShow && !this.needShowChilds)
7342   return;
7343  for (var i = 0; i < this.accessKeys.length; i++) {
7344   var accessKey = this.accessKeys[i];
7345   if (accessKey) {
7346    var popupElement = accessKey.getPopupElement ? accessKey.getPopupElement(accessKey.popupItem) : null;
7347    if (popupElement && this.isElementVisible(popupElement)) {
7348     this.show(accessKey);
7349    }
7350    accessKey.showAccessKeys();
7351   }
7352  }
7353 },
7354 isElementVisible: function (el) { return ASPx.IsElementVisible(el, true); },
7355 show: function(accessKey) {
7356  var keyTipElement = accessKey.keyTipElement;
7357  var popupElement = accessKey.getPopupElement(accessKey.popupItem);
7358  this.showKeyTipElement(keyTipElement, this.calculateCoordinates(accessKey, keyTipElement, popupElement));
7359 },
7360 showKeyTipElement: function (keyTipElement, coordinates) {
7361  ASPx.SetAbsoluteY(keyTipElement, coordinates.top);
7362  ASPx.SetAbsoluteX(keyTipElement, coordinates.left);
7363  ASPx.SetElementVisibility(keyTipElement, true); 
7364 },
7365 calculateCoordinates: function (accessKey, keyTipElement, popupElement) {
7366  var top = ASPx.GetAbsolutePositionY(popupElement);
7367  var left = ASPx.GetAbsolutePositionX(popupElement);
7368  if (accessKey.popupItem.getAccessKeyPosition)
7369   switch (accessKey.popupItem.getAccessKeyPosition()) {
7370    case "AboveRight":
7371     left = left + popupElement.offsetWidth - keyTipElement.offsetWidth / 3;
7372     top = top - keyTipElement.offsetHeight / 2;
7373     break;
7374    case "Right":
7375     left = left + popupElement.offsetWidth - keyTipElement.offsetWidth / 3;
7376     top = top + popupElement.offsetHeight / 2 - keyTipElement.offsetHeight / 2;
7377     break;
7378    case "BelowRight":
7379     left = left + popupElement.offsetWidth - keyTipElement.offsetWidth / 3;
7380     top = top + keyTipElement.offsetHeight / 2;
7381     break;
7382    default:
7383     top = top + popupElement.offsetHeight;
7384     left = left + popupElement.offsetWidth / 2 - keyTipElement.offsetWidth / 2;
7385     break;
7386   }
7387  else {
7388   top = top + popupElement.offsetHeight;
7389   left = left + popupElement.offsetWidth / 2 - keyTipElement.offsetWidth / 2;
7390  }
7391  return { top: top, left: left };
7392 },
7393 hide: function() {
7394  if (this.keyTipElement)
7395   ASPx.SetElementVisibility(this.keyTipElement, false);
7396 },
7397 hideChildAccessKeys: function () {
7398  this.hideAccessKeys(this.accessKeys);
7399 },
7400 hideAccessKeys: function (accessKeys) {
7401  if (accessKeys) {
7402   for (var i = 0, accessKey; accessKey = accessKeys[i]; i++) {
7403    if (accessKey.keyTipElement)
7404     accessKey.hide();
7405    accessKey.hideChildAccessKeys();
7406   }
7407  }
7408 },
7409 hideAll: function () {
7410  this.getRoot(this).hideChildAccessKeys();
7411 },
7412 getRoot: function (accessKey) {
7413  if (!accessKey.parent)
7414   return accessKey;
7415  return this.getRoot(accessKey.parent);
7416 }
7417});
7418var focusedElement = null;
7419function aspxOnElementFocused(evt) {
7420 evt = ASPx.Evt.GetEvent(evt);
7421 if(evt && evt.target)
7422  focusedElement = evt.target;
7423}
7424function _aspxInitializeFocus() {
7425 if(!ASPx.GetActiveElement())
7426  ASPx.Evt.AttachEventToDocument("focus", aspxOnElementFocused);
7427}
7428function _aspxGetFocusedElement() {
7429 var activeElement = ASPx.GetActiveElement();
7430 return activeElement ? activeElement : focusedElement;
7431}
7432CheckBoxCheckState = {
7433 Checked : "Checked",
7434 Unchecked : "Unchecked",
7435 Indeterminate : "Indeterminate"
7436};
7437CheckBoxInputKey = { 
7438 Checked : "C",
7439 Unchecked : "U",
7440 Indeterminate : "I"
7441};
7442var CheckableElementStateController = ASPx.CreateClass(null, {
7443 constructor: function(imageProperties) {
7444  this.checkBoxStates = [];
7445  this.imageProperties = imageProperties;
7446  this.customImageMarkerClassName = "dxcbCI";
7447 },
7448 GetValueByInputKey: function(inputKey) {
7449  return this.GetFirstValueBySecondValue("Value", "StateInputKey", inputKey);
7450 },
7451 GetInputKeyByValue: function(value) {
7452  return this.GetFirstValueBySecondValue("StateInputKey", "Value", value);
7453 },
7454 GetImagePropertiesNumByInputKey: function(value) {
7455  return this.GetFirstValueBySecondValue("ImagePropertiesNumber", "StateInputKey", value);
7456 },
7457 GetNextCheckBoxValue: function(currentValue, allowGrayed) {
7458  var currentInputKey = this.GetInputKeyByValue(currentValue);
7459  var nextInputKey = '';
7460  switch(currentInputKey) {
7461   case CheckBoxInputKey.Checked:
7462    nextInputKey = CheckBoxInputKey.Unchecked; break;
7463   case CheckBoxInputKey.Unchecked:
7464    nextInputKey = allowGrayed ? CheckBoxInputKey.Indeterminate : CheckBoxInputKey.Checked; break;
7465   case CheckBoxInputKey.Indeterminate:
7466    nextInputKey = CheckBoxInputKey.Checked; break;
7467  }
7468  return this.GetValueByInputKey(nextInputKey);
7469 },
7470 GetCheckStateByInputKey: function(inputKey) {
7471  switch(inputKey) {
7472   case CheckBoxInputKey.Checked: 
7473    return CheckBoxCheckState.Checked;
7474   case CheckBoxInputKey.Unchecked: 
7475    return CheckBoxCheckState.Unchecked;
7476   case CheckBoxInputKey.Indeterminate: 
7477    return CheckBoxCheckState.Indeterminate;
7478  }
7479 },
7480 GetValueByCheckState: function(checkState) {
7481  switch(checkState) {
7482   case CheckBoxCheckState.Checked: 
7483    return this.GetValueByInputKey(CheckBoxInputKey.Checked);
7484   case CheckBoxCheckState.Unchecked: 
7485    return this.GetValueByInputKey(CheckBoxInputKey.Unchecked);
7486   case CheckBoxCheckState.Indeterminate: 
7487    return this.GetValueByInputKey(CheckBoxInputKey.Indeterminate);
7488  }
7489 },
7490 GetFirstValueBySecondValue: function(firstValueName, secondValueName, secondValue) {
7491  return this.GetValueByFunc(firstValueName, 
7492   function(checkBoxState) { return checkBoxState[secondValueName] === secondValue; });
7493 },
7494 GetValueByFunc: function(valueName, func) {
7495  for(var i = 0; i < this.checkBoxStates.length; i++) {
7496   if(func(this.checkBoxStates[i]))
7497    return this.checkBoxStates[i][valueName];
7498  }  
7499 },
7500 AssignElementClassName: function(element, cssClassPropertyKey, disabledCssClassPropertyKey, assignedClassName) {
7501  var classNames = [ ];
7502  for(var i = 0; i < this.imageProperties[cssClassPropertyKey].length; i++) {
7503   classNames.push(this.imageProperties[disabledCssClassPropertyKey][i]);
7504   classNames.push(this.imageProperties[cssClassPropertyKey][i]);
7505  }
7506  var elementClassName = element.className;
7507  for(var i = 0; i < classNames.length; i++) {
7508   var className = classNames[i];
7509   var index = elementClassName.indexOf(className);
7510   if(index > -1)
7511    elementClassName = elementClassName.replace((index == 0 ? '' : ' ') + className, "");
7512  }
7513  elementClassName += " " + assignedClassName;
7514  element.className = elementClassName;
7515 },
7516 UpdateInternalCheckBoxDecoration: function(mainElement, inputKey, enabled) {
7517  var imagePropertiesNumber = this.GetImagePropertiesNumByInputKey(inputKey);
7518  for(var imagePropertyKey in this.imageProperties) {
7519   if(this.imageProperties.hasOwnProperty(imagePropertyKey)) {
7520    var propertyValue = this.imageProperties[imagePropertyKey][imagePropertiesNumber];
7521    propertyValue = propertyValue || !isNaN(propertyValue) ? propertyValue : "";
7522    switch(imagePropertyKey) {
7523     case "0" : mainElement.title = propertyValue; break;
7524     case "1" : mainElement.style.width = propertyValue + (propertyValue != "" ? "px" : ""); break;
7525     case "2" : mainElement.style.height = propertyValue + (propertyValue != "" ? "px" : ""); break;
7526    }
7527    if(enabled) {
7528     switch(imagePropertyKey) {
7529      case "3" : this.SetImageSrc(mainElement, propertyValue); break;
7530      case "4" : 
7531       this.AssignElementClassName(mainElement, "4", "8", propertyValue);
7532       break;
7533      case "5" : this.SetBackgroundPosition(mainElement, propertyValue, true); break;
7534      case "6" : this.SetBackgroundPosition(mainElement, propertyValue, false); break;
7535     }
7536    } else {
7537     switch(imagePropertyKey) {
7538      case "7" : this.SetImageSrc(mainElement, propertyValue); break;
7539      case "8" : 
7540       this.AssignElementClassName(mainElement, "4", "8", propertyValue);
7541       break;
7542      case "9" : this.SetBackgroundPosition(mainElement, propertyValue, true); break;
7543      case "10" : this.SetBackgroundPosition(mainElement, propertyValue, false); break;
7544     }
7545    }
7546   }
7547  }
7548 },
7549 SetImageSrc: function(mainElement, src) {
7550  if(src === ""){
7551   mainElement.style.backgroundImage = "";
7552   mainElement.style.backgroundPosition = "";
7553   ASPx.RemoveClassNameFromElement(mainElement, this.customImageMarkerClassName);
7554  }
7555  else{
7556   mainElement.style.backgroundImage = "url('" + src + "')";
7557   this.SetBackgroundPosition(mainElement, 0, true);
7558   this.SetBackgroundPosition(mainElement, 0, false);
7559   ASPx.AddClassNameToElement(mainElement, this.customImageMarkerClassName);
7560  }
7561 },
7562 SetBackgroundPosition: function(element, value, isX) {
7563  if(value === "") {
7564   element.style.backgroundPosition = value;
7565   return;
7566  }
7567  if(element.style.backgroundPosition === "")
7568   element.style.backgroundPosition = isX ? "-" + value.toString() + "px 0px" : "0px -" + value.toString() + "px";
7569  else {
7570   var position = element.style.backgroundPosition.split(' ');
7571   element.style.backgroundPosition = isX ? '-' + value.toString() + "px " + position[1] :  position[0] + " -" + value.toString() + "px";
7572  }
7573 },
7574 AddState: function(value, stateInputKey, imagePropertiesNumber) {
7575  this.checkBoxStates.push({
7576   "Value" : value, 
7577   "StateInputKey" : stateInputKey, 
7578   "ImagePropertiesNumber" : imagePropertiesNumber
7579  });
7580 },
7581 GetAriaCheckedValue: function(state) {
7582  switch(state) {
7583   case ASPx.CheckBoxCheckState.Checked: return "true";
7584   case ASPx.CheckBoxCheckState.Unchecked: return "false";
7585   case ASPx.CheckBoxCheckState.Indeterminate: return "mixed";
7586   default: return "";
7587  }
7588 },
7589 GetAriaSelectedValue: function(state) {
7590  switch(state) {
7591   case ASPx.CheckBoxCheckState.Checked: return "true";
7592   case ASPx.CheckBoxCheckState.Unchecked: return "false";
7593   case ASPx.CheckBoxCheckState.Indeterminate: return "undefined";
7594   default: return "";
7595  }
7596 },
7597 SetAriaCheckedSelectedAttributes: function(mainElement, state) {
7598  if(mainElement.attributes["aria-checked"] !== undefined) {
7599   var ariaCheckedValue = this.GetAriaCheckedValue(state);
7600   mainElement.setAttribute("aria-checked", ariaCheckedValue);
7601  }
7602  if(mainElement.attributes["aria-selected"] !== undefined) {
7603   var ariaSelectedValue = this.GetAriaSelectedValue(state);
7604   mainElement.setAttribute("aria-selected", ariaSelectedValue);
7605  }
7606 }
7607});
7608CheckableElementStateController.Create = function(imageProperties, valueChecked, valueUnchecked, valueGrayed, allowGrayed) {
7609 var stateController = new CheckableElementStateController(imageProperties);
7610 stateController.AddState(valueChecked, CheckBoxInputKey.Checked, 0);
7611 stateController.AddState(valueUnchecked, CheckBoxInputKey.Unchecked, 1);
7612 if(typeof(valueGrayed) != "undefined")
7613  stateController.AddState(valueGrayed, CheckBoxInputKey.Indeterminate, allowGrayed ? 2 : 1);
7614 stateController.allowGrayed = allowGrayed;
7615 return stateController;
7616};
7617var CheckableElementHelper = ASPx.CreateClass(null, {
7618 InternalCheckBoxInitialize: function(internalCheckBox) {
7619  this.AttachToMainElement(internalCheckBox);
7620  this.AttachToInputElement(internalCheckBox);
7621 },
7622 AttachToMainElement: function(internalCheckBox) {
7623  var instance = this;
7624  if(internalCheckBox.mainElement) {
7625    var toggleEvent = internalCheckBox.displaySwitch ? ASPx.TouchUIHelper.touchMouseDownEventName : "click";
7626    ASPx.Evt.AttachEventToElement(internalCheckBox.mainElement, toggleEvent,
7627    function (evt) {
7628     if(ASPx.Evt.IsRightButtonPressed(evt))
7629      return;
7630     instance.InvokeClick(internalCheckBox, evt);
7631     if(!internalCheckBox.disableCancelBubble)
7632      return ASPx.Evt.PreventEventAndBubble(evt);
7633    }
7634   );
7635   ASPx.Evt.AttachEventToElement(internalCheckBox.mainElement, "mousedown",
7636    function (evt) {
7637     internalCheckBox.Refocus();
7638    }
7639   );
7640   ASPx.Evt.PreventElementDragAndSelect(internalCheckBox.mainElement, true);
7641  }
7642 },
7643 AttachToInputElement: function(internalCheckBox) {
7644  var instance = this;
7645  if(internalCheckBox.inputElement && internalCheckBox.mainElement) {
7646   var checkableElement = internalCheckBox.accessibilityCompliant ? internalCheckBox.mainElement : internalCheckBox.inputElement;
7647   ASPx.Evt.AttachEventToElement(checkableElement, "focus",
7648    function (evt) { 
7649     if(!internalCheckBox.enabled)
7650      checkableElement.blur();
7651     else
7652      internalCheckBox.OnFocus();
7653    }
7654   );
7655   ASPx.Evt.AttachEventToElement(checkableElement, "blur", 
7656    function (evt) { 
7657     internalCheckBox.OnLostFocus();
7658    }
7659   );
7660   ASPx.Evt.AttachEventToElement(checkableElement, "keyup",
7661    function (evt) { 
7662     if(ASPx.Evt.GetKeyCode(evt) == ASPx.Key.Space)
7663      instance.InvokeClick(internalCheckBox, evt);
7664    }
7665   );
7666   ASPx.Evt.AttachEventToElement(checkableElement, "keydown",
7667    function (evt) { 
7668     if(ASPx.Evt.GetKeyCode(evt) == ASPx.Key.Space)
7669      return ASPx.Evt.PreventEvent(evt);
7670    }
7671   );
7672  }
7673 },
7674 IsKBSInputWrapperExist: function() {
7675  return ASPx.Browser.Opera || ASPx.Browser.WebKitFamily;
7676 },
7677 GetICBMainElementByInput: function(icbInputElement) {
7678  return this.IsKBSInputWrapperExist() ? icbInputElement.parentNode.parentNode : icbInputElement.parentNode;
7679 },
7680 RequirePreventFocus: function() { return false; },
7681 InvokeClick: function(internalCheckBox, evt) {
7682  if(internalCheckBox.enabled && !internalCheckBox.GetReadOnly()) {
7683   var inputElementValue = internalCheckBox.inputElement.value;
7684   var focusableElement = internalCheckBox.accessibilityCompliant ? internalCheckBox.mainElement : internalCheckBox.inputElement; 
7685   if(!this.RequirePreventFocus())
7686    focusableElement.focus();
7687   internalCheckBox.inputElement.value = inputElementValue; 
7688   this.InvokeClickCore(internalCheckBox, evt);
7689   }
7690 },
7691 InvokeClickCore: function(internalCheckBox, evt) {
7692  internalCheckBox.OnClick(evt);
7693 }
7694});
7695CheckableElementHelper.Instance = new CheckableElementHelper();
7696var CheckBoxInternal = ASPx.CreateClass(null, {
7697 constructor: function(inputElement, stateController, allowGrayed, allowGrayedByClick, helper, container, storeValueInInput, key, disableCancelBubble,
7698  accessibilityCompliant, displaySwitch) {
7699  this.inputElement = inputElement;
7700  this.mainElement = helper.GetICBMainElementByInput(this.inputElement);
7701  this.name = (key ? key : this.inputElement.id) + CheckBoxInternal.GetICBMainElementPostfix();
7702  this.mainElement.id = this.name;
7703  this.stateController = stateController;
7704  this.container = container;
7705  this.allowGrayed = allowGrayed;
7706  this.allowGrayedByClick = allowGrayedByClick;
7707  this.autoSwitchEnabled = true;
7708  this.displaySwitch = displaySwitch;
7709  this.storeValueInInput = !!storeValueInInput;
7710  this.storedInputKey = !this.storeValueInInput ? this.inputElement.value : null;
7711  this.disableCancelBubble = !!disableCancelBubble;
7712  this.accessibilityCompliant = accessibilityCompliant;
7713  this.focusDecoration = null;
7714  this.focused = false;
7715  this.focusLocked = false;
7716  this.enabled = !this.mainElement.className.match(/dxWeb_\w+Disabled(\b|_)/);
7717  this.readOnly = false;
7718  this.preventFocus = helper.RequirePreventFocus();
7719  this.CheckedChanged = new ASPxClientEvent();
7720  this.Focus = new ASPxClientEvent();
7721  this.LostFocus = new ASPxClientEvent();
7722  helper.InternalCheckBoxInitialize(this);
7723 },
7724 GetReadOnly: function() {
7725  return this.readOnly;
7726 },
7727 ChangeInputElementTabIndex: function() {  
7728  var changeMethod = this.enabled ? ASPx.Attr.RestoreTabIndexAttribute : ASPx.Attr.SaveTabIndexAttributeAndReset;
7729  changeMethod(this.inputElement);
7730 },
7731 CreateFocusDecoration: function(focusedStyle) {
7732   this.focusDecoration = new FocusedStyleDecoration(this);
7733   this.focusDecoration.AddStyle('F', focusedStyle[0], focusedStyle[1]);
7734   this.focusDecoration.AddPostfix("");
7735 },
7736 UpdateFocusDecoration: function() {
7737  this.focusDecoration.Update();
7738 },  
7739 StoreInputKey: function(inputKey) {
7740  if(this.storeValueInInput)
7741   this.inputElement.value = inputKey;
7742  else
7743   this.storedInputKey = inputKey;
7744 },
7745 GetStoredInputKey: function() {
7746  if(this.storeValueInInput)
7747   return this.inputElement.value;
7748  else
7749   return this.storedInputKey;
7750 },
7751 OnClick: function(e) {
7752  if(this.autoSwitchEnabled) {
7753   var currentValue = this.GetValue();
7754   var value = this.stateController.GetNextCheckBoxValue(currentValue, this.allowGrayedByClick && this.allowGrayed);
7755   this.SetValue(value);
7756  }
7757  this.CheckedChanged.FireEvent(this, e);
7758 },
7759 OnFocus: function() {
7760  if(!this.IsFocusLocked()) {
7761   this.focused = true;
7762   this.UpdateFocusDecoration();
7763   this.Focus.FireEvent(this, null);
7764  } else
7765   this.UnlockFocus();
7766 },
7767 OnLostFocus: function() {
7768  if(!this.IsFocusLocked()) {
7769   this.focused = false;
7770   this.UpdateFocusDecoration();
7771   this.LostFocus.FireEvent(this, null);
7772  }
7773 },
7774 Refocus: function() {
7775  if(this.preventFocus) return;
7776  if(this.focused) {
7777   this.LockFocus();
7778   this.inputElement.blur();
7779   if(ASPx.Browser.MacOSMobilePlatform) {
7780    window.setTimeout(function() {
7781     ASPx.SetFocus(this.inputElement);
7782    }, ASPx.FOCUS_TIMEOUT);
7783   } else {
7784    ASPx.SetFocus(this.inputElement);
7785   }
7786  }
7787 },
7788 LockFocus: function() {
7789  this.focusLocked = true;
7790 },
7791 UnlockFocus: function() {
7792  this.focusLocked = false;
7793 },
7794 IsFocusLocked: function() {
7795  if(!!ASPx.Attr.GetAttribute(this.mainElement, ASPx.Attr.GetTabIndexAttributeName()))
7796   return false;
7797  return this.focusLocked;
7798 },
7799 SetValue: function(value, force) {
7800  var currentValue = this.GetValue();
7801  if(currentValue !== value || force) {
7802   var newInputKey = this.stateController.GetInputKeyByValue(value);
7803   if(newInputKey) {
7804    this.StoreInputKey(newInputKey);   
7805    this.stateController.UpdateInternalCheckBoxDecoration(this.mainElement, newInputKey, this.enabled);
7806   }
7807  }
7808  if(this.accessibilityCompliant) {
7809   var state = this.GetCurrentCheckState();
7810   this.stateController.SetAriaCheckedSelectedAttributes(this.mainElement, state);
7811  }
7812 },
7813 GetValue: function() {
7814  return this.stateController.GetValueByInputKey(this.GetCurrentInputKey());
7815 },
7816 GetCurrentCheckState: function() {
7817  return this.stateController.GetCheckStateByInputKey(this.GetCurrentInputKey());
7818 },
7819 GetCurrentInputKey: function() {
7820  return this.GetStoredInputKey();
7821 },
7822 GetChecked: function() {
7823  return this.GetCurrentInputKey() === CheckBoxInputKey.Checked;
7824 },
7825 SetChecked: function(checked) {
7826  var newValue = this.stateController.GetValueByCheckState(checked ? CheckBoxCheckState.Checked : CheckBoxCheckState.Unchecked);
7827  this.SetValue(newValue);
7828 },
7829 SetEnabled: function(enabled) {
7830  if(this.enabled != enabled) {
7831   this.enabled = enabled;
7832   this.stateController.UpdateInternalCheckBoxDecoration(this.mainElement, this.GetCurrentInputKey(), this.enabled);
7833   this.ChangeInputElementTabIndex();
7834  }
7835 },
7836 GetEnabled: function() {
7837  return this.enabled;
7838 }
7839});
7840CheckBoxInternal.GetICBMainElementPostfix = function() {
7841 return "_D";
7842};
7843var CheckBoxInternalCollection = ASPx.CreateClass(CollectionBase, {
7844 constructor: function(imageProperties, allowGrayed, storeValueInInput, helper, disableCancelBubble, accessibilityCompliant) {
7845  this.constructor.prototype.constructor.call(this);
7846  this.stateController = allowGrayed 
7847   ? CheckableElementStateController.Create(imageProperties, CheckBoxInputKey.Checked, CheckBoxInputKey.Unchecked, CheckBoxInputKey.Indeterminate, true)
7848   : CheckableElementStateController.Create(imageProperties, CheckBoxInputKey.Checked, CheckBoxInputKey.Unchecked);
7849  this.helper = helper || CheckableElementHelper.Instance;
7850  this.storeValueInInput = !!storeValueInInput;
7851  this.disableCancelBubble = !!disableCancelBubble;
7852  this.accessibilityCompliant = accessibilityCompliant;
7853 },
7854 Add: function(key, inputElement, container) {
7855  this.Remove(key);
7856  var checkBox = this.CreateInternalCheckBox(key, inputElement, container);
7857  CollectionBase.prototype.Add.call(this, key, checkBox);
7858  return checkBox;
7859 },
7860 SetImageProperties: function(imageProperties) {
7861  this.stateController.imageProperties = imageProperties;
7862 },
7863 CreateInternalCheckBox: function(key, inputElement, container) {
7864  return new CheckBoxInternal(inputElement, this.stateController, this.stateController.allowGrayed, false, this.helper, container, 
7865   this.storeValueInInput, key, this.disableCancelBubble, this.accessibilityCompliant);
7866 }
7867});
7868var FocusedStyleDecoration = ASPx.CreateClass(null, {
7869 constructor: function(editor) {
7870  this.editor = editor;
7871  this.postfixList = [];
7872  this.styles = {};
7873  this.innerStyles = {};
7874 },
7875 AddPostfix: function(value) {
7876  this.postfixList.push(value);
7877 },
7878 AddStyle: function(key, className, cssText) {
7879  this.styles[key] = this.CreateRule(className, cssText);
7880  this.innerStyles[key] = this.CreateRule("", this.FilterInnerCss(cssText));
7881 },
7882 CreateRule: function(className, cssText) {
7883  return ASPx.Str.Trim(className + " " + ASPx.CreateImportantStyleRule(this.GetStyleSheet(), cssText));
7884 },
7885 GetStyleSheet: function() {
7886  return ASPx.GetCurrentStyleSheet();
7887 },
7888 FilterInnerCss: function(css) {
7889  return css.replace(/(border|background-image)[^:]*:[^;]+/gi, "");
7890 },
7891 Update: function() {
7892  for(var i = 0; i < this.postfixList.length; i++) {
7893   var postfix = this.postfixList[i];
7894   var inner = postfix.length > 0;
7895   var element = this.GetElementByPostfix(postfix);
7896   if(element)
7897    this.ApplyStyles(element, inner);
7898  }
7899 },
7900 GetElementByPostfix: function(postfix) {
7901  return ASPx.GetElementById(this.editor.name + postfix);
7902 },
7903 ApplyStyles: function(element, inner) {
7904  this.ApplyFocusedStyle(element, inner);
7905 },
7906 ApplyFocusedStyle: function(element, inner) {
7907  if(this.HasDecoration("F"))
7908   this.ApplyDecoration("F", element, inner, this.editor.focused);
7909 },
7910 HasDecoration: function(key) {
7911  return !!this.styles[key];
7912 },
7913 ApplyDecoration: function(key, element, inner, active) {
7914  var value = inner ? this.innerStyles[key] : this.styles[key];
7915  this.RemoveDecoration(element, value);
7916  if(active)
7917   ASPx.AddClassNameToElement(element, value);
7918 },
7919 RemoveDecoration: function(element, value) {
7920  ASPx.RemoveClassNameFromElement(element, value);
7921 },
7922 ApplyDecorationCore: function() {
7923 },
7924 EnsureElementBorder: function(element) {
7925  var border = parseInt(element.border) || 0;
7926  element.border = 1;
7927  element.border = border;
7928 }
7929});
7930var EditorStyleDecoration = ASPx.CreateClass(FocusedStyleDecoration, {
7931 constructor: function(editor) {
7932  this.constructor.prototype.constructor.call(this, editor);
7933  this.lockUpdate = false;
7934 },
7935 LockUpdate: function() {
7936  this.lockUpdate = true;
7937 },
7938 UnlockUpdate: function() {
7939  this.lockUpdate = false;
7940 },
7941 IsUpdateLocked: function() {
7942  return this.lockUpdate;
7943 },
7944 Update: function () {
7945  if(this.IsUpdateLocked())
7946   return;
7947  ASPx.FocusedStyleDecoration.prototype.Update.call(this);
7948 },
7949 ApplyStyles: function (element, inner) {
7950  this.ApplyInvalidStyle(element, inner);
7951  ASPx.FocusedStyleDecoration.prototype.ApplyStyles.call(this, element, inner);
7952 },
7953 ApplyInvalidStyle: function (element, inner) {
7954  if(this.HasDecoration("I")) {
7955   var isValid = this.editor.GetIsValid();
7956   this.ApplyDecoration("I", element, inner, !isValid);
7957  }
7958 }
7959});
7960var TextEditorStyleDecoration = ASPx.CreateClass(EditorStyleDecoration, {
7961 constructor: function(editor) {
7962  this.constructor.prototype.constructor.call(this, editor);
7963  this.nullTextClassName = "";
7964 },
7965 ApplyStyles: function(element, inner) {
7966  ASPx.EditorStyleDecoration.prototype.ApplyStyles.call(this, element, inner);
7967  this.ApplyNullTextStyle(element, inner);
7968 },
7969 ApplyNullTextStyle: function(element, inner) {
7970  if(!this.HasDecoration("N"))
7971   return;
7972  var apply = !this.editor.focused && this.editor.CanApplyNullTextDecoration();
7973  this.EnsureSpellcheckAttribute(element, apply);
7974  this.ApplyDecoration("N", element, inner, apply);
7975 },
7976 EnsureSpellcheckAttribute: function(element, apply) {
7977  if(apply)
7978   ASPx.Attr.ChangeAttribute(element, "spellcheck", "false");
7979  else
7980   ASPx.Attr.RestoreAttribute(element, "spellcheck");
7981 },
7982 ApplyNullTextClassName: function(active) {
7983  var nullTextClassName = this.GetNullTextClassName();
7984  var editorMainElement = this.editor.GetMainElement();
7985  if(active)
7986   ASPx.AddClassNameToElement(editorMainElement, nullTextClassName);
7987  else
7988   ASPx.RemoveClassNameFromElement(editorMainElement, nullTextClassName);
7989 },
7990 GetNullTextClassName: function() {
7991  if (!this.nullTextClassName)
7992   this.InitializeNullTextClassName();
7993  return this.nullTextClassName;
7994 },
7995 InitializeNullTextClassName: function() {
7996  var nullTextStyle = this.styles["N"];
7997  if (nullTextStyle) {
7998   var nullTextStyleClassNames = nullTextStyle.split(" ");
7999   for (var i = 0; i < nullTextStyleClassNames.length; i++)
8000    if (nullTextStyleClassNames[i].match("dxeNullText"))
8001     this.nullTextClassName = nullTextStyleClassNames[i];
8002  }
8003 }
8004});
8005var touchUIHelperUsePointerEvents = (ASPx.Browser.Edge || ASPx.Browser.EdgeWebKit) && ASPx.Browser.MSTouchUI && !!window.PointerEvent;
8006var TouchUIHelper = {
8007 isGesture: false,
8008 isMouseEventFromScrolling: false,
8009 isNativeScrollingAllowed: true,
8010 clickSensetivity: 10,
8011 documentTouchHandlers: {},
8012 documentEventAttachingAllowed: true,
8013 msTouchDraggableClassName: "dxMSTouchDraggable",
8014 touchMouseDownEventName: ASPx.Browser.WebKitTouchUI ? "touchstart" : (touchUIHelperUsePointerEvents ? "pointerdown" : "mousedown"),
8015 touchMouseUpEventName: ASPx.Browser.WebKitTouchUI ? "touchend" : (touchUIHelperUsePointerEvents ? "pointerup" : "mouseup"),
8016 touchMouseMoveEventName: ASPx.Browser.WebKitTouchUI ? "touchmove" : (touchUIHelperUsePointerEvents ? "pointermove" : "mousemove"),
8017 startPreventingTouchMove: function() {
8018  if(touchUIHelperUsePointerEvents)
8019   ASPx.Evt.AttachEventToDocument("touchmove", ASPx.Evt.PreventEvent);
8020 },
8021 stopPreventingTouchMove: function() {
8022  if(touchUIHelperUsePointerEvents)
8023   ASPx.Evt.DetachEventFromDocument("touchmove", ASPx.Evt.PreventEvent);
8024 },
8025 isTouchEvent: function(evt) {
8026  if(!evt) return false;
8027  return ASPx.Browser.WebKitTouchUI && ASPx.IsExists(evt.changedTouches); 
8028 },
8029 isTouchEventName: function(eventName) {
8030  return ASPx.Browser.WebKitTouchUI && (eventName.indexOf("touch") > -1 || eventName.indexOf("gesture") > -1);
8031 },
8032 getEventX: function(evt) {
8033  var touchPoint = null;
8034  if(evt.changedTouches.length > 0)
8035   touchPoint = evt.changedTouches;
8036  else if(evt.targetTouches.length > 0)
8037   touchPoint = evt.targetTouches;
8038  return touchPoint ? touchPoint[0].pageX : 0;
8039 },
8040 getEventY: function(evt) { 
8041  var touchPoint = null;
8042  if(evt.changedTouches.length > 0)
8043   touchPoint = evt.changedTouches;
8044  else if(evt.targetTouches.length > 0)
8045   touchPoint = evt.targetTouches;
8046  return touchPoint ? touchPoint[0].pageY : 0;
8047 },
8048 getWebkitMajorVersion: function(){
8049  if(!this.webkitMajorVersion){
8050   var regExp = new RegExp("applewebkit/(\\d+)", "i");
8051   var matches = regExp.exec(ASPx.Browser.UserAgent);
8052   if(matches && matches.index >= 1)
8053    this.webkitMajorVersion = matches[1];
8054  }
8055  return this.webkitMajorVersion;
8056 },
8057 getIsLandscapeOrientation: function(){
8058  if(ASPx.Browser.MacOSMobilePlatform || ASPx.Browser.AndroidMobilePlatform)
8059   return Math.abs(window.orientation) == 90;
8060  return ASPx.GetDocumentClientWidth() > ASPx.GetDocumentClientHeight();
8061 },
8062 nativeScrollingSupported: function() {
8063  var allowedSafariVersion = ASPx.Browser.Version >= 5.1 && ASPx.Browser.Version < 8; 
8064  var webkitMajorVersion = this.getWebkitMajorVersion();
8065  var allowedWebKitVersion = webkitMajorVersion > 533 && webkitMajorVersion < 600;
8066  return (ASPx.Browser.MacOSMobilePlatform && (allowedSafariVersion || allowedWebKitVersion))
8067   || (ASPx.Browser.AndroidMobilePlatform && ASPx.Browser.PlaformMajorVersion >= 3) || (ASPx.Browser.MSTouchUI);
8068 },
8069 makeScrollableIfRequired: function(element, options) {
8070  if(ASPx.Browser.WebKitTouchUI && element) {
8071   var overflow = ASPx.GetCurrentStyle(element).overflow;
8072   if(element.tagName == "DIV" &&  overflow != "hidden" && overflow != "visible" ){
8073    return this.MakeScrollable(element);
8074   }
8075  }
8076 },
8077 preventScrollOnEvent: function(evt){
8078 },
8079 handleFastTapIfRequired: function(evt, action, preventCommonClickEvents) {
8080  if(ASPx.Browser.WebKitTouchUI && evt.type == 'touchstart' && action) {
8081   this.FastTapHelper.HandleFastTap(evt, action, preventCommonClickEvents);
8082   return true;
8083  }
8084  return false;
8085 },
8086 ensureDocumentSizesCorrect: function (){
8087  return (document.documentElement.clientWidth - document.documentElement.clientHeight) / (screen.width - screen.height) > 0;
8088 },
8089 ensureOrientationChanged: function(onOrientationChangedFunction){
8090  if(ASPxClientUtils.iOSPlatform || this.ensureDocumentSizesCorrect())
8091   onOrientationChangedFunction();
8092  else {
8093   window.setTimeout(function(){
8094    this.ensureOrientationChanged(onOrientationChangedFunction);
8095   }.aspxBind(this), 100);
8096  }
8097 },
8098 onEventAttachingToDocument: function(eventName, func){
8099  if(ASPx.Browser.MacOSMobilePlatform && this.isTouchEventName(eventName)) {
8100   if(!this.documentTouchHandlers[eventName])
8101    this.documentTouchHandlers[eventName] = [];
8102   this.documentTouchHandlers[eventName].push(func);
8103   return this.documentEventAttachingAllowed;
8104  }
8105  return true;
8106 },
8107 onEventDettachedFromDocument: function(eventName, func){
8108  if(ASPx.Browser.MacOSMobilePlatform && this.isTouchEventName(eventName)) {
8109   var handlers = this.documentTouchHandlers[eventName];
8110   if(handlers)
8111    ASPx.Data.ArrayRemove(handlers, func);
8112  }
8113 },
8114 processDocumentTouchEventHandlers: function(proc) {
8115  var touchEventNames = ["touchstart", "touchend", "touchmove", "gesturestart", "gestureend"];
8116  for(var i = 0; i < touchEventNames.length; i++) {
8117   var eventName = touchEventNames[i];
8118   var handlers = this.documentTouchHandlers[eventName];
8119   if(handlers) {
8120    for(var j = 0; j < handlers.length; j++) {
8121     proc(eventName,handlers[j]);
8122    }
8123   }
8124  }
8125 },
8126 removeDocumentTouchEventHandlers: function() {
8127  if(ASPx.Browser.MacOSMobilePlatform) {
8128   this.documentEventAttachingAllowed = false;
8129   this.processDocumentTouchEventHandlers(ASPx.Evt.DetachEventFromDocumentCore);
8130  }
8131 },
8132 restoreDocumentTouchEventHandlers: function () {
8133  if(ASPx.Browser.MacOSMobilePlatform) {
8134   this.documentEventAttachingAllowed = true;
8135   this.processDocumentTouchEventHandlers(ASPx.Evt.AttachEventToDocumentCore);
8136  }
8137 },
8138 IsNativeScrolling: function() {
8139  return TouchUIHelper.nativeScrollingSupported() && TouchUIHelper.isNativeScrollingAllowed;
8140 },
8141 pointerEnabled: !!(window.PointerEvent || window.MSPointerEvent),
8142 pointerDownEventName: window.PointerEvent ? "pointerdown" : "MSPointerDown",
8143 pointerUpEventName: window.PointerEvent ? "pointerup" : "MSPointerUp",
8144 pointerCancelEventName: window.PointerEvent ? "pointercancel" : "MSPointerCancel",
8145 pointerMoveEventName: window.PointerEvent ? "pointermove" : "MSPointerMove",
8146 pointerOverEventName: window.PointerEvent ? "pointerover" : "MSPointerOver",
8147 pointerOutEventName: window.PointerEvent ? "pointerout" : "MSPointerOut",
8148 pointerType: {
8149  Touch: "touch",
8150  Pen: "pen",
8151  Mouse: "mouse"
8152 },
8153 msGestureEnabled: !!(window.PointerEvent || window.MSPointerEvent) && typeof(MSGesture) != "undefined",
8154 msTouchCreateGesturesWrapper: function(element, onTap){
8155  if(!TouchUIHelper.msGestureEnabled) 
8156   return;
8157  var gesture = new MSGesture();
8158  gesture.target = element;
8159  ASPx.Evt.AttachEventToElement(element, TouchUIHelper.pointerDownEventName, function(evt){
8160   gesture.addPointer(evt.pointerId);
8161  });
8162  ASPx.Evt.AttachEventToElement(element, TouchUIHelper.pointerUpEventName, function(evt){
8163   gesture.stop();
8164  });
8165  if(onTap)
8166   ASPx.Evt.AttachEventToElement(element, "MSGestureTap", onTap);
8167  return gesture;
8168 },
8169 useLongTapHelper: function () {
8170  return ASPx.Browser.Safari && ASPx.Browser.TouchUI;
8171 },
8172 attachLongTapHandler: function(element, handler, onlyBubbling) {
8173  var timerID = -1;
8174  var timeout = 1000;
8175  var event = null;
8176  var preventClickEvent = false;
8177  var startX = -1;
8178  var startY = -1;
8179  var pixelLimit = 5;
8180  function onTouchMouseDown(evt) {
8181   abortWating();
8182   event = evt;
8183   startX = evt.pageX;
8184   startY = evt.pageY;
8185   preventClickEvent = false;
8186   timerID = window.setTimeout(onTimeout, timeout);
8187  }
8188  function onTouchMouseMove(evt) {
8189   if (!isUnderTouch())
8190    return;
8191   var shiftX = Math.abs(startX - evt.pageX),
8192    shiftY = Math.abs(startY - evt.pageY),
8193    maxShift = Math.max(shiftX, shiftY);
8194   if (maxShift > pixelLimit)
8195    abortWating();
8196  }
8197  function onTouchMouseUp(evt) {
8198   abortWating();
8199   if (preventClickEvent) {
8200    ASPx.Evt.PreventEventAndBubble(evt);
8201    preventClickEvent = false;
8202   }
8203  }
8204  function onTimeout() {
8205   handler(event);
8206   preventClickEvent = true;
8207   abortWatingInternal();
8208  }
8209  function isUnderTouch() {
8210   return timerID !== -1;
8211  }
8212  function abortWating() {
8213   if (isUnderTouch()) {
8214    window.clearTimeout(timerID);
8215    abortWatingInternal();
8216   }
8217  }
8218  function abortWatingInternal() {
8219   timerID = -1;
8220   event = null;
8221  }
8222  ASPx.Evt.AttachEventToElement(element, TouchUIHelper.touchMouseDownEventName, onTouchMouseDown, onlyBubbling);
8223  ASPx.Evt.AttachEventToElement(element, TouchUIHelper.touchMouseMoveEventName, onTouchMouseMove, onlyBubbling);
8224  ASPx.Evt.AttachEventToElement(element, TouchUIHelper.touchMouseUpEventName, onTouchMouseUp, onlyBubbling);
8225  element.style["-webkit-user-select"] = "none";
8226  return function () {
8227   ASPx.Evt.DetachEventFromElement(element, TouchUIHelper.touchMouseDownEventName, onTouchMouseDown);
8228   ASPx.Evt.DetachEventFromElement(element, TouchUIHelper.touchMouseMoveEventName, onTouchMouseMove);
8229   ASPx.Evt.DetachEventFromElement(element, TouchUIHelper.touchMouseUpEventName, onTouchMouseUp);
8230   element.style["-webkit-user-select"] = "";
8231  };
8232 }
8233};
8234var CacheHelper = {};
8235CacheHelper.GetCachedValueCore = function(obj, key, func, cacheObj, fillValueMethod) {
8236 if(!cacheObj)
8237  cacheObj = obj;
8238 if(!cacheObj.cache)
8239  cacheObj.cache = {};
8240 if(!key) 
8241  key = "default";
8242 fillValueMethod(obj, key, func, cacheObj);
8243 return cacheObj.cache[key];
8244};
8245CacheHelper.GetCachedValue = function(obj, key, func, cacheObj) {
8246 return CacheHelper.GetCachedValueCore(obj, key, func, cacheObj, 
8247  function(obj, key, func, cacheObj) {
8248   if(!ASPx.IsExists(cacheObj.cache[key]))
8249    cacheObj.cache[key] = func.apply(obj, []);
8250  });
8251};
8252CacheHelper.GetCachedElement = function(obj, key, func, cacheObj) {
8253 return CacheHelper.GetCachedValueCore(obj, key, func, cacheObj, 
8254  function(obj, key, func, cacheObj) {
8255   if(!ASPx.IsValidElement(cacheObj.cache[key]))
8256    cacheObj.cache[key] = func.apply(obj, []);
8257  });
8258};
8259CacheHelper.GetCachedElements = function(obj, key, func, cacheObj) {
8260 return CacheHelper.GetCachedValueCore(obj, key, func, cacheObj, 
8261  function(obj, key, func, cacheObj) {
8262   if(!ASPx.IsValidElements(cacheObj.cache[key])){
8263    var elements = func.apply(obj, []);
8264    if(!Ident.IsArray(elements))
8265     elements = [elements];
8266    cacheObj.cache[key] = elements;
8267   }
8268  });
8269};
8270CacheHelper.GetCachedElementById = function(obj, id, cacheObj) {
8271 return CacheHelper.GetCachedElement(obj, id, function() { return ASPx.GetElementById(id); }, cacheObj);
8272};
8273CacheHelper.GetCachedChildById = function(obj, parent, id, cacheObj) {
8274 return CacheHelper.GetCachedElement(obj, id, function() { return ASPx.GetChildById(parent, id); }, cacheObj);
8275};
8276CacheHelper.DropCachedValue = function(cacheObj, key) {
8277 cacheObj.cache[key] = null;
8278};  
8279CacheHelper.DropCache = function(cacheObj) {
8280 cacheObj.cache = null;
8281};  
8282var DomObserver = ASPx.CreateClass(null, {
8283 constructor: function() {
8284  this.items = { };
8285 },
8286 subscribe: function(elementID, callbackFunc) {
8287  var item = this.items[elementID];
8288  if(item)
8289   this.unsubscribe(elementID);
8290  item = {
8291   elementID: elementID,
8292   callbackFunc: callbackFunc,
8293   pauseCount: 0
8294  };
8295  this.prepareItem(item);
8296  this.items[elementID] = item;
8297 },
8298 prepareItem: function(item) {
8299 },
8300 unsubscribe: function(elementID) {
8301  this.items[elementID] = null;
8302 },
8303 getItemElement: function(item) {
8304  var element = this.getElementById(item.elementID);
8305  if(element)
8306   return element;
8307  this.unsubscribe(item.elementID);
8308  return null;
8309 },
8310 getElementById: function(elementID) {
8311  var element = document.getElementById(elementID);
8312  return element && ASPx.IsValidElement(element) ? element : null;
8313 },
8314 pause: function(element, includeSubtree) {
8315  this.changeItemsState(element, includeSubtree, true);
8316 },
8317 resume: function(element, includeSubtree) {
8318  this.changeItemsState(element, includeSubtree, false);
8319 },
8320 forEachItem: function(processFunc, context) {
8321  context = context || this;
8322  for(var itemName in this.items) {
8323   if(!this.items.hasOwnProperty(itemName))
8324    continue;
8325   var item = this.items[itemName];
8326   if(item) {
8327    var needBreak = processFunc.call(context, item);
8328    if(needBreak)
8329     return;
8330   }
8331  }
8332 },
8333 changeItemsState: function(element, includeSubtree, pause) {
8334  this.forEachItem(function(item) {
8335   if(!element)
8336    this.changeItemState(item, pause);
8337   else {
8338    var itemElement = this.getItemElement(item);
8339    if(itemElement && (element == itemElement || (includeSubtree && ASPx.GetIsParent(element, itemElement)))) {
8340     this.changeItemState(item, pause);
8341     if(!includeSubtree)
8342      return true;
8343    }
8344   }
8345  }.aspxBind(this));
8346 },
8347 changeItemState: function(item, pause) {
8348  if(pause)
8349   this.pauseItem(item);
8350  else
8351   this.resumeItem(item);
8352 },
8353 pauseItem: function(item) {
8354  item.paused = true;
8355  item.pauseCount++;
8356 },
8357 resumeItem: function(item) {
8358  if(item.pauseCount > 0) {
8359   if(item.pauseCount == 1)
8360    item.paused = false;
8361   item.pauseCount--;
8362  }
8363 }
8364});
8365DomObserver.IsMutationObserverAvailable = function() {
8366 return !!window.MutationObserver;
8367};
8368var TimerObserver = ASPx.CreateClass(DomObserver, {
8369 constructor: function() {
8370  this.constructor.prototype.constructor.call(this);
8371  this.timerID = -1;
8372  this.observationTimeout = 300;
8373 },
8374 subscribe: function(elementID, callbackFunc) {
8375  DomObserver.prototype.subscribe.call(this, elementID, callbackFunc);
8376  if(!this.isActivated())
8377   this.startObserving();
8378 },
8379 isActivated: function() {
8380  return this.timerID !== -1;
8381 },
8382 startObserving: function() {
8383  if(this.isActivated())
8384   window.clearTimeout(this.timerID);
8385  this.timerID = window.setTimeout(this.onTimeout, this.observationTimeout);
8386 },
8387 onTimeout: function() {
8388  var observer = _aspxGetDomObserver();
8389  observer.doObserve();
8390  observer.startObserving();
8391 },
8392 doObserve: function() {
8393  if(!ASPx.documentLoaded) return;
8394  this.forEachItem(function(item) {
8395   if(!item.paused)
8396    this.doObserveForItem(item);
8397  }.aspxBind(this));
8398 },
8399 doObserveForItem: function(item) {
8400  var element = this.getItemElement(item);
8401  if(element)
8402   item.callbackFunc.call(this, element);
8403 }
8404});
8405var MutationObserver = ASPx.CreateClass(DomObserver, {
8406 constructor: function() {
8407  this.constructor.prototype.constructor.call(this);
8408  this.callbackTimeout = 10;
8409 },
8410 prepareItem: function(item) {
8411  item.callbackTimerID = -1;
8412  var target = this.getElementById(item.elementID);
8413  if(!target)
8414   return;
8415  var observerCallbackFunc = function() {
8416   if(item.callbackTimerID === -1) {
8417    var timeoutHander = function() {
8418     item.callbackTimerID = -1;
8419     item.callbackFunc.call(this, target);
8420    }.aspxBind(this);
8421    item.callbackTimerID = window.setTimeout(timeoutHander, this.callbackTimeout);
8422   }
8423  }.aspxBind(this);
8424  var observer = new window.MutationObserver(observerCallbackFunc);
8425  var config = { attributes: true, childList: true, characterData: true, subtree: true };
8426  observer.observe(target, config);
8427  item.observer = observer;
8428  item.config = config;
8429 },
8430 unsubscribe: function(elementID) {
8431  var item = this.items[elementID];
8432  if(item) {
8433   item.observer.disconnect();
8434   item.observer = null;
8435  }
8436  DomObserver.prototype.unsubscribe.call(this, elementID);
8437 },
8438 pauseItem: function(item) {
8439  DomObserver.prototype.pauseItem.call(this, item);
8440  item.observer.disconnect();
8441 },
8442 resumeItem: function(item) {
8443  DomObserver.prototype.resumeItem.call(this, item);
8444  if(!item.paused) {
8445   var target = this.getItemElement(item);
8446   if(target)
8447    item.observer.observe(target, item.config);
8448  }
8449 }
8450});
8451var domObserver = null;
8452function _aspxGetDomObserver() {
8453 if(domObserver == null)
8454  domObserver = DomObserver.IsMutationObserverAvailable() ? new MutationObserver() : new TimerObserver();
8455 return domObserver;
8456}
8457var ControlUpdateWatcher = ASPx.CreateClass(null, {
8458 constructor: function() {
8459  this.helpers = { };
8460  this.clearLockerTimerID = -1;
8461  this.clearLockerTimerDelay = 15;
8462  this.postProcessing = false;
8463  this.init();
8464 },
8465 init: function() {
8466  var postHandler = aspxGetPostHandler();
8467  postHandler.Post.AddHandler(this.OnPost, this);
8468 },
8469 Add: function(helper) {
8470  this.helpers[helper.GetName()] = helper;
8471 },
8472 CanSendCallback: function(dxCallbackOwner, arg) {
8473  this.LockConfirmOnBeforeWindowUnload();
8474  var modifiedHelpers = this.FilterModifiedHelpersByDXCallbackOwner(this.GetModifiedHelpers(), dxCallbackOwner, arg);
8475  if(modifiedHelpers.length === 0) return true;
8476  var modifiedHelpersInfo = this.GetToConfirmAndToResetLists(modifiedHelpers, dxCallbackOwner.name);
8477  if(!modifiedHelpersInfo) return true;
8478  if(modifiedHelpersInfo.toConfirm.length === 0) {
8479   this.ResetClientChanges(modifiedHelpersInfo.toReset);
8480   return true;
8481  }
8482  var helper = modifiedHelpersInfo.toConfirm[0];
8483  if(!confirm(helper.GetConfirmUpdateText()))
8484   return false;
8485  this.ResetClientChanges(modifiedHelpersInfo.toReset);
8486  return true;
8487 },
8488 OnPost: function(s, e) {
8489  if(this.isDxCallback(e))
8490   return;
8491  this.postProcessing = true;
8492  this.LockConfirmOnBeforeWindowUnload();
8493  var modifiedHelpersInfo = this.GetModifedHelpersInfo(e);
8494  if(!modifiedHelpersInfo)
8495   return;
8496  if(modifiedHelpersInfo.toConfirm.length === 0) {
8497   this.ResetClientChanges(modifiedHelpersInfo.toReset);
8498   return;
8499  }
8500  var helper = modifiedHelpersInfo.toConfirm[0];
8501  if(!confirm(helper.GetConfirmUpdateText())) {
8502   e.cancel = true;
8503   this.finishPostProcessing();
8504  }
8505  if(!e.cancel)
8506   this.ResetClientChanges(modifiedHelpersInfo.toReset);
8507 },
8508 isDxCallback: function(e) {
8509  return e.isDXCallback || this.isInternalUploadControlCallback();
8510 },
8511 isInternalUploadControlCallback: function() {
8512  var isInCallback = false;
8513  for(var key in this.helpers) {
8514   if(this.helpers.hasOwnProperty(key)) {
8515    var helper = this.helpers[key];
8516    isInCallback = isInCallback || helper.isInUploadCallback();
8517   }
8518  }
8519  return isInCallback;
8520 },
8521 finishPostProcessing: function() {
8522  this.postProcessing = false;
8523 },
8524 GetModifedHelpersInfo: function(e) {
8525  var modifiedHelpers = this.FilterModifiedHelpers(this.GetModifiedHelpers(), e);
8526  if(modifiedHelpers.length === 0) return;
8527  return this.GetToConfirmAndToResetLists(modifiedHelpers, e && e.ownerID);
8528 },
8529 GetToConfirmAndToResetLists: function(modifiedHelpers, ownerID) {
8530  var resetList = [ ];
8531  var confirmList = [ ];
8532  for(var i = 0; i < modifiedHelpers.length; i++) {
8533   var helper = modifiedHelpers[i];
8534   if(!helper.GetConfirmUpdateText()) { 
8535    resetList.push(helper);
8536    continue;
8537   }
8538   if(helper.CanShowConfirm(ownerID)) { 
8539    resetList.push(helper);
8540    confirmList.push(helper);
8541   }
8542  }
8543  return { toConfirm: confirmList, toReset: resetList };
8544 },
8545 FilterModifiedHelpers: function(modifiedHelpers, e) {
8546  if(modifiedHelpers.length === 0)
8547   return [ ];
8548  if(this.RequireProcessUpdatePanelCallback(e))
8549   return this.FilterModifiedHelpersByUpdatePanels(modifiedHelpers);
8550  if(this.postProcessing)
8551   return this.FilterModifiedHelpersByPostback(modifiedHelpers);
8552  return modifiedHelpers;
8553 },
8554 FilterModifiedHelpersByDXCallbackOwner: function(modifiedHelpers, dxCallbackOwner, arg) {
8555  var result = [ ];
8556  for(var i = 0; i < modifiedHelpers.length; i++) {
8557   var helper = modifiedHelpers[i];
8558   if(helper.NeedConfirmOnCallback(dxCallbackOwner, arg))
8559    result.push(helper);
8560  }
8561  return result;
8562 },
8563 FilterModifiedHelpersByUpdatePanels: function(modifiedHelpers) {
8564  var result = [ ];
8565  var updatePanels = this.GetUpdatePanelsWaitedForUpdate();
8566  for(var i = 0; i < updatePanels.length; i++) {
8567   var panelID = updatePanels[i].replace(/\$/g, "_");
8568   var panel = ASPx.GetElementById(panelID);
8569   if(!panel) continue;
8570   for(var j = 0; j < modifiedHelpers.length; j++) {
8571    var helper = modifiedHelpers[j];
8572    if(ASPx.GetIsParent(panel, helper.GetControlMainElement()))
8573     result.push(helper);
8574   }
8575  }
8576  return result;
8577 },
8578 FilterModifiedHelpersByPostback: function(modifiedHelpers) {
8579  var result = [ ];
8580  for(var i = 0; i < modifiedHelpers.length; i++) {
8581   var helper = modifiedHelpers[i];
8582   if(helper.NeedConfirmOnPostback())
8583    result.push(helper);
8584  }
8585  return result;
8586 },
8587 RequireProcessUpdatePanelCallback: function(e) {
8588  var rManager = this.GetMSRequestManager();
8589  if(rManager && e && e.isMSAjaxCallback)
8590   return rManager._postBackSettings.async;
8591  return false;
8592 },
8593 GetUpdatePanelsWaitedForUpdate: function() {
8594  var rManager = this.GetMSRequestManager();
8595  if(!rManager) return [ ];
8596  var panelUniqueIDs = rManager._postBackSettings.panelsToUpdate || [ ];
8597  var panelClientIDs = [ ];
8598  for(var i = 0; i < panelUniqueIDs.length; i++) {
8599   var index = ASPx.Data.ArrayIndexOf(rManager._updatePanelIDs, panelUniqueIDs[i]);
8600   if(index >= 0)
8601    panelClientIDs.push(rManager._updatePanelClientIDs[index]);
8602  }
8603  return panelClientIDs;
8604 },
8605 GetMSRequestManager: function() {
8606  return ASPx.GetMSAjaxRequestManager();
8607 },
8608 GetModifiedHelpers: function() {
8609  var result = [ ];
8610  for(var key in this.helpers) { 
8611   if(this.helpers.hasOwnProperty(key)) {
8612    var helper = this.helpers[key];
8613    if(helper.HasChanges())
8614     result.push(helper);
8615   }
8616  }
8617  return result;
8618 },
8619 ResetClientChanges: function(modifiedHelpers) {
8620  for(var i = 0; i < modifiedHelpers.length; i++)
8621   modifiedHelpers[i].ResetClientChanges();
8622 },
8623 GetConfirmUpdateMessage: function() {
8624  if(this.confirmOnWindowUnloadLocked) return;
8625  var modifiedHelpersInfo = this.GetModifedHelpersInfo();
8626  if(!modifiedHelpersInfo || modifiedHelpersInfo.toConfirm.length === 0) 
8627   return;
8628  var helper = modifiedHelpersInfo.toConfirm[0];
8629  return helper.GetConfirmUpdateText();
8630 },
8631 LockConfirmOnBeforeWindowUnload: function() {
8632  this.confirmOnWindowUnloadLocked = true;
8633  this.clearLockerTimerID = ASPx.Timer.ClearTimer(this.clearLockerTimerID);
8634  this.clearLockerTimerID = window.setTimeout(function() {
8635   this.confirmOnWindowUnloadLocked = false;
8636  }.aspxBind(this), this.clearLockerTimerDelay);
8637 },
8638 OnWindowBeforeUnload: function(e) {
8639  var confirmMessage = this.GetConfirmUpdateMessage();
8640  if(confirmMessage)
8641   e.returnValue = confirmMessage;
8642  this.finishPostProcessing();
8643  return confirmMessage;
8644 },
8645 OnWindowUnload: function(e) {
8646  if(this.confirmOnWindowUnloadLocked) return;
8647  var modifiedHelpersInfo = this.GetModifedHelpersInfo();
8648  if(!modifiedHelpersInfo) return;
8649  this.ResetClientChanges(modifiedHelpersInfo.toReset);
8650 },
8651 OnMouseDown: function(e) {
8652 },
8653 OnFocusIn: function(e) {
8654 },
8655 PreventBeforeUnloadOnLinkClick: function(e) {
8656  if(ASPx.GetObjectKeys(this.helpers).length == 0)
8657   return;
8658  var link = ASPx.GetParentByTagName(ASPx.Evt.GetEventSource(e), "A");
8659  if(!link || link.dxgvLinkClickHanlderAssigned)
8660   return;
8661  var url = ASPx.Attr.GetAttribute(link, "href");
8662  if(!url || url.indexOf("javascript:") < 0)
8663   return;
8664  ASPx.Evt.AttachEventToElement(link, "click", function(ev) { return ASPx.Evt.PreventEvent(ev); });
8665  link.dxgvLinkClickHanlderAssigned = true;
8666 }
8667});
8668ControlUpdateWatcher.Instance = null;
8669ControlUpdateWatcher.getInstance = function () {
8670 if (!ControlUpdateWatcher.Instance) {
8671  ControlUpdateWatcher.Instance = new ControlUpdateWatcher();
8672  ASPx.Evt.AttachEventToElement(window, "beforeunload", function(e) {
8673   return ControlUpdateWatcher.Instance.OnWindowBeforeUnload(e);
8674  });
8675  ASPx.Evt.AttachEventToElement(window, "unload", function(e) {
8676   ControlUpdateWatcher.Instance.OnWindowUnload(e);
8677  });
8678  ASPx.Evt.AttachEventToDocument("mousedown", function(e) {
8679   ControlUpdateWatcher.Instance.OnMouseDown(e);
8680  });
8681  ASPx.Evt.AttachEventToDocument("focusin", function(e) {
8682   ControlUpdateWatcher.Instance.OnFocusIn(e);
8683  });
8684 }
8685 return ControlUpdateWatcher.Instance;
8686};
8687var UpdateWatcherHelper = ASPx.CreateClass(null, {
8688 constructor: function(owner) {
8689  this.owner = owner;
8690  this.ownerWatcher = ControlUpdateWatcher.getInstance();
8691  this.ownerWatcher.Add(this);
8692 },
8693 GetName: function() {
8694  return this.owner.name;
8695 },
8696 GetControlMainElement: function() {
8697  return this.owner.GetMainElement();
8698 },
8699 GetControlParentForm: function(){
8700  return ASPx.GetParentByTagName(this.GetControlMainElement(), "FORM");
8701 },
8702 CanShowConfirm: function(requestOwnerID) {
8703  return true;
8704 },
8705 HasChanges: function() {
8706  return false;
8707 },
8708 GetConfirmUpdateText: function() {
8709  return "";
8710 },
8711 NeedConfirmOnCallback: function(dxCallbackOwner) {
8712  return true;
8713 },
8714 NeedConfirmOnPostback: function() {
8715  if(ASPx.IsUploadSubmitRequest)
8716   return !ASPx.IsUploadSubmitRequest(this.GetControlParentForm(
8716));
8717  return true;
8718 },
8719 ResetClientChanges: function() {
8720 },
8721 ConfirmOnCustomControlEvent: function() {
8722  var confirmMessage = this.GetConfirmUpdateText();
8723  if(confirmMessage)
8724   return confirm(confirmMessage);
8725  return false;
8726 },
8727 isInUploadCallback: function() {
8728  return false;
8729 }
8730});
8731var ControlTabIndexManager = ASPx.CreateClass(null, {
8732 constructor: function() {
8733  this.elementsWithChangedTabIndex = {};
8734 },
8735 getChangedElementsForControlId: function(id) {
8736  if(!this.elementsWithChangedTabIndex[id])
8737   this.elementsWithChangedTabIndex[id] = [];
8738  return this.elementsWithChangedTabIndex[id];
8739 },
8740 isElementWithChangedIndex: function(element) {
8741  for(var key in this.elementsWithChangedTabIndex)
8742   if(this.elementsWithChangedTabIndex.hasOwnProperty(key))
8743    if(this.elementsWithChangedTabIndex[key].indexOf(element) !== -1)
8744     return true;
8745  return false;
8746 },
8747 changeTabIndexAttribute: function(element, id) {
8748  var elements = this.getChangedElementsForControlId(id);
8749  ASPx.Attr.ChangeTabIndexAttribute(element);
8750  if(elements.indexOf(element) === -1)
8751   elements.push(element);
8752 },
8753 restoreTabIndexAttribute: function(element, id) {
8754  var elements = this.getChangedElementsForControlId(id),
8755   index = elements.indexOf(element);
8756  if(index !== -1) {
8757   elements.splice(index, 1);
8758   if(!this.isElementWithChangedIndex(element))
8759    ASPx.Attr.RestoreTabIndexAttribute(element);
8760  }
8761 }
8762});
8763ControlTabIndexManager.Instance = null;
8764ControlTabIndexManager.getInstance = function() {
8765 if(!ControlTabIndexManager.Instance)
8766  ControlTabIndexManager.Instance = new ControlTabIndexManager();
8767 return ControlTabIndexManager.Instance;
8768};
8769var ControlCallbackHandlersQueue = ASPx.CreateClass(null, {
8770 constructor: function (owner) {
8771  this.owner = owner;
8772  this.handlerInfos = [];
8773 },
8774 addCallbackHandler: function(handlerInfo) {
8775  this.handlerInfos.push(handlerInfo);
8776 },
8777 executeCallbacksHandlers: function() {
8778  for(var i = 0, handlerInfo; handlerInfo = this.handlerInfos[i]; i++)
8779   handlerInfo.handler.call(this.owner, handlerInfo.result);
8780  this.handlerInfos = [];
8781 }
8782});
8783var ControlCallbackQueueHelper = ASPx.CreateClass(null, {
8784 constructor: function (owner) {
8785  this.owner = owner;
8786  this.pendingCallbacks = [];
8787  this.receivedCallbacks = [];
8788  this.attachEvents();
8789 },
8790 showLoadingElements: function () {
8791  this.owner.ShowLoadingDiv();
8792  if (this.owner.IsCallbackAnimationEnabled())
8793   this.owner.StartBeginCallbackAnimation();
8794  else
8795   this.owner.ShowLoadingElementsInternal();
8796 },
8797 attachEvents: function () {
8798  this.owner.EndCallback.AddHandler(this.onEndCallback.aspxBind(this));
8799  this.owner.CallbackError.AddHandler(this.onCallbackError.aspxBind(this));
8800 },
8801 detachEvents: function () {
8802  this.owner.EndCallback.RemoveHandler(this.onEndCallback);
8803  this.owner.CallbackError.RemoveHandler(this.onCallbackError);
8804 },
8805 onCallbackError: function (owner, result) {
8806  this.sendErrorToChildControl(result);
8807 },
8808 ignoreDuplicates: function () {
8809  return true;
8810 },
8811 hasDuplicate: function (arg) {
8812  for (var i in this.pendingCallbacks) {
8813   if (this.pendingCallbacks[i].arg == arg && this.pendingCallbacks[i].state != ASPx.callbackState.aborted)
8814    return true;
8815  }
8816  return false;
8817 },
8818 getToken: function (halperContext, callbackInfo) {
8819  return {
8820   cancel: function () {
8821    if (callbackInfo.state == ASPx.callbackState.sent) {
8822     callbackInfo.state = ASPx.callbackState.aborted;
8823     halperContext.sendNext();
8824    }
8825    if (callbackInfo.state == ASPx.callbackState.inTurn)
8826     ASPx.Data.ArrayRemove(halperContext.pendingCallbacks, callbackInfo);
8827   },
8828   callbackId: -1
8829  };
8830 },
8831 sendCallback: function (arg, handlerContext, handler, commandName, onBeforeSend) {
8832  if (this.ignoreDuplicates() && this.hasDuplicate(arg))
8833   return false;
8834  var handlerContext = handlerContext || this.owner;
8835  var callbackInfo = {
8836   arg: arg,
8837   handlerContext: handlerContext,
8838   handler: handler || handlerContext.OnCallback,
8839   state: ASPx.callbackState.inTurn,
8840   callbackId: -1,
8841   onBeforeSend: onBeforeSend
8842  };
8843  this.pendingCallbacks.push(callbackInfo);
8844  if (!this.hasActiveCallback()) {
8845   this.createCallbackByCallbackInfo(callbackInfo, commandName);
8846  }
8847  return this.getToken(this, callbackInfo);
8848 },
8849 hasActiveCallback: function () {
8850  return this.getCallbacksInfoByState(ASPx.callbackState.sent).length > 0;
8851 },
8852 sendNext: function () {
8853  var nextCallbackInfo = this.getCallbacksInfoByState(ASPx.callbackState.inTurn)[0];
8854  if (nextCallbackInfo) {
8855   this.createCallbackByCallbackInfo(nextCallbackInfo);
8856   return nextCallbackInfo.callbackId;
8857  }
8858 },
8859 createCallbackByCallbackInfo: function(callbackInfo, commandName) {
8860  if(callbackInfo.onBeforeSend)
8861   callbackInfo.onBeforeSend();
8862  callbackInfo.callbackId = this.owner.CreateCallback(callbackInfo.arg, commandName);
8863  callbackInfo.state = ASPx.callbackState.sent;
8864 },
8865 onEndCallback: function () {
8866  if (!this.owner.isErrorOnCallback && this.hasPendingCallbacks()) {
8867   var curCallbackId;
8868   var curCallbackInfo;
8869   var handlerContext;
8870   for (var i in this.receivedCallbacks) {
8871    if(this.receivedCallbacks.hasOwnProperty(i)) {
8872     curCallbackId = this.receivedCallbacks[i];
8873     curCallbackInfo = this.getCallbackInfoById(curCallbackId);
8874     if (curCallbackInfo.state != ASPx.callbackState.aborted) {
8875      handlerContext = curCallbackInfo.handlerContext;
8876      if (handlerContext.OnEndCallback)
8877       handlerContext.OnEndCallback();
8878      this.sendNext();
8879     }
8880     ASPx.Data.ArrayRemove(this.pendingCallbacks, curCallbackInfo);
8881    }
8882   }
8883   ASPx.Data.ArrayClear(this.receivedCallbacks);
8884  }
8885 },
8886 hasPendingCallbacks: function () {
8887  return this.pendingCallbacks && this.pendingCallbacks.length && this.pendingCallbacks.length > 0;
8888 },
8889 processCallback: function (result, callbackId) {
8890  this.receivedCallbacks.push(callbackId);
8891  if (this.hasPendingCallbacks()) {
8892   var callbackInfo = this.getCallbackInfoById(callbackId);
8893   if (callbackInfo.state != ASPx.callbackState.aborted)
8894    callbackInfo.handler.call(callbackInfo.handlerContext, result);
8895  }
8896 },
8897 getCallbackInfoById: function (id) {
8898  for (var i in this.pendingCallbacks) {
8899   if (this.pendingCallbacks[i].callbackId == id)
8900    return this.pendingCallbacks[i];
8901  }
8902 },
8903 getCallbacksInfoByState: function (state) {
8904  var result = [];
8905  for (var i in this.pendingCallbacks) {
8906   if (this.pendingCallbacks[i].state == state)
8907    result.push(this.pendingCallbacks[i]);
8908  }
8909  return result;
8910 },
8911 sendErrorToChildControl: function (callbackObj) {
8912  if (!this.hasPendingCallbacks())
8913   return;
8914  var callbackInfo = this.getCallbackInfoById(callbackObj.callbackId || 0);
8915  if (!callbackInfo)
8916   return;
8917  var hasChildControlHandler = (callbackInfo.handlerContext != this.owner) && callbackInfo.handlerContext.OnCallbackError;
8918  if (hasChildControlHandler)
8919   callbackInfo.handlerContext.OnCallbackError.call(callbackInfo.handlerContext, callbackObj.message, callbackObj.data);
8920 }
8921});
8922var AccessibilityHelperBase = ASPx.CreateClass(null, {
8923 constructor: function(control) {
8924  this.control = control;
8925  this.pronounceMessageTimeout = 500;
8926  this.pronounceIsStarted = false;
8927  this.timerID = -1;
8928 },
8929 PronounceMessage: function(text, activeItemArgs, inactiveItemArgs, mainElementArgs, ownerMainElement) {
8930  this.timerID = ASPx.Timer.ClearTimer(this.timerID);
8931  this.pronounceIsStarted = true;
8932  this.timerID = window.setTimeout(function() {
8933   this.PronounceMessageCore(text, activeItemArgs, inactiveItemArgs, mainElementArgs, ownerMainElement);
8934  }.aspxBind(this), this.getPronounceTimeout());
8935 },
8936 PronounceMessageCore: function(text) {
8937  this.processValidationState();
8938  if(this.control.IsFocused())
8939   this.control.SendMessageToAssistiveTechnology(text);
8940 },
8941 GetActiveElement: function(inputIsMainElement) {
8942  if(this.pronounceIsStarted) return null;
8943  var mainElement = inputIsMainElement ? this.control.GetInputElement() : this.getMainElement();
8944  var activeElementId = ASPx.Attr.GetAttribute(mainElement, 'aria-activedescendant');
8945  return activeElementId ? ASPx.GetElementById(activeElementId) : mainElement;
8946 },
8947 GetPronounceElement: function() { return null; },
8948 processValidationState: function() {
8949  var errorTextElement = null;
8950  if(this.control.GetErrorCell())
8951   errorTextElement = this.getAriaExplanatoryTextManager().GetErrorTextElement();
8952  var input = this.getInputElement();
8953  var invalidArg =  { "aria-invalid": !this.control.isValid ? "true" : "" };
8954  this.changeActivityAttributes(input, invalidArg);
8955  if(errorTextElement)
8956   this.getAriaExplanatoryTextManager().SetOrRemoveText([input], errorTextElement, !this.control.isValid, false, true);
8957 },
8958 getMainElement: function() {
8959  if(!ASPx.IsExistsElement(this.mainElement))
8960   this.mainElement = this.control.GetAccessibilityAssistantElement();
8961  return this.mainElement;
8962 },
8963 changeActivityAttributes: function(element, args) {
8964  if(!element)
8965   return;
8966  for(var key in args) {
8967   if(args.hasOwnProperty(key)) {
8968    var value = args[key];
8969    if(key == "innerHtml")
8970     ASPx.SetInnerHtml(element, value);
8971    else {
8972     var action = value !== "" ? ASPx.Attr.SetAttribute : ASPx.Attr.RemoveAttribute;
8973     action(element, key, value);
8974    }
8975   }
8976  }
8977 },
8978 getPronounceTimeout: function() { return this.pronounceMessageTimeout; },
8979 getInputElement: function() { return this.control.GetInputElement(); },
8980 getAriaExplanatoryTextManager: function() { return this.control.ariaExplanatoryTextManager; }
8981});
8982var AccessibilityHelper = ASPx.CreateClass(AccessibilityHelperBase, {
8983 constructor: function(control) {
8984  this.constructor.prototype.constructor.call(this, control);
8985  this.activeItem = this.getItems()[0];
8986 },
8987 PronounceMessageCore: function(text, activeItemArgs, inactiveItemArgs, mainElementArgs, ownerMainElement) {
8988  if(!this.getItems())
8989   return;
8990  this.toogleItem();
8991  var mainElement = this.getMainElement();
8992  var activeItem = this.getItem(true);
8993  var inactiveItem = this.getItem();
8994  if(ASPx.Attr.GetAttribute(mainElement, "role") != "application")
8995   mainElementArgs = this.addArguments(mainElementArgs, { "aria-activedescendant" : activeItem.id });
8996  var messageAttrObj = {};
8997  var activeItemRole = ASPx.Attr.GetAttribute(activeItem, "role");
8998  var attrName = activeItemRole == "combobox" ? "aria-label" : "innerHtml";
8999  messageAttrObj[attrName] = ASPx.Str.EncodeHtml(text);
9000  activeItemArgs = this.addArguments(activeItemArgs, messageAttrObj);
9001  messageAttrObj[attrName] = "";
9002  inactiveItemArgs = this.addArguments(inactiveItemArgs, messageAttrObj);
9003  var errorTextElement = null;
9004  if(this.control.GetErrorCell()) {
9005   errorTextElement = this.getAriaExplanatoryTextManager().GetErrorTextElement();
9006   activeItemArgs = this.addArguments(activeItemArgs,   {"aria-invalid"  : !this.control.isValid ? "true" : "" });
9007   mainElementArgs = this.addArguments(mainElementArgs, { "aria-invalid" : "" });
9008   inactiveItemArgs = this.addArguments(inactiveItemArgs,  { "aria-invalid" : "" });
9009  }
9010  this.changeActivityAttributes(activeItem, activeItemArgs);
9011  if(errorTextElement) {
9012   this.getAriaExplanatoryTextManager().SetOrRemoveText([activeItem], errorTextElement, !this.control.isValid, false, true);
9013   this.getAriaExplanatoryTextManager().SetOrRemoveText([mainElement, inactiveItem], errorTextElement, false, false, false);
9014  }
9015  this.changeActivityAttributes(mainElement, mainElementArgs);
9016  if(!!ownerMainElement && ASPx.Attr.GetAttribute(ownerMainElement, "role") != "application")
9017   this.changeActivityAttributes(ownerMainElement, { "aria-activedescendant": activeItem.id });
9018  this.changeActivityAttributes(inactiveItem, inactiveItemArgs);
9019  this.pronounceIsStarted = false;
9020 },
9021 GetPronounceElement: function() {
9022  return this.getItem(true);
9023 },
9024 getItems: function() {
9025  if(!ASPx.IsExistsElement(this.items))
9026   this.items = ASPx.GetChildElementNodes(this.getMainElement());
9027  return this.items;
9028 },
9029 getItem: function(isActive) {
9030  if(isActive)
9031   return this.activeItem;
9032  var items = this.getItems();
9033  return items[0] === this.activeItem ? items[1] : items[0];
9034 },
9035 toogleItem: function() {
9036  this.activeItem = this.getItem();
9037 },
9038 addArguments: function(targetArgs, newArgs) {
9039  if(!targetArgs) targetArgs = { };
9040  for(var key in newArgs) {
9041   if(newArgs.hasOwnProperty(key) && !targetArgs.hasOwnProperty(key))
9042    targetArgs[key] = newArgs[key];
9043  }
9044  return targetArgs;
9045 }
9046});
9047var AccessibilityPronouncer = ASPx.CreateClass(null, {
9048 constructor: function() {
9049  this.pronouncerId = "dxPronouncer";
9050  this.initialized = false;
9051  this.focusableMessageElement = null;
9052  this.messageElement = null;
9053  this.pronouncers = {
9054   live: new AccessibilityLivePronouncer(this),
9055   descendant: new AccessibilityDescendantPronouncer(this)
9056  };
9057 },
9058 Pronounce: function(args, type) {
9059  this.pronouncers[type].Pronounce(args);
9060 },
9061 EnsureInitialize: function() {
9062  if(!this.initialized)
9063   this.initialize();
9064 },
9065 RemoveState: function() {
9066  for(var pronouncer in this.pronouncers)
9067   if(this.pronouncers.hasOwnProperty(pronouncer))
9068    pronouncer.RemoveState();
9069 },
9070 RestoreControlState: function(type, mainElement) {
9071  this.pronouncers[type].RestoreControlState(mainElement);
9072 },
9073 RestoreElementsState: function(type, elements) {
9074  this.pronouncers[type].RestoreElementsState(elements);
9075 },
9076 RestoreElementState: function(type, element) {
9077  this.pronouncers[type].RestoreElementState(element);
9078 },
9079 initialize: function() {
9080  this.createFocusableMessageElement();
9081  this.createMessageElement();
9082  this.prepareFocusableMessageElement();
9083  this.setAttributesForKeyboardNavigation();
9084  this.initialized = true;
9085 },
9086 createFocusableMessageElement: function() {
9087  var focusableMessageElement = document.createElement("DIV");
9088  document.body.appendChild(focusableMessageElement);
9089  this.focusableMessageElement = focusableMessageElement;   
9090 },
9091 prepareFocusableMessageElement: function() {
9092  this.focusableMessageElement.className = "dxAIFME";
9093 },
9094 setAttributesForKeyboardNavigation: function() {
9095  ASPx.Attr.Aria.SetApplicationRole(this.focusableMessageElement);
9096  ASPx.Attr.Aria.SetSilence(this.focusableMessageElement);
9097 },
9098 createMessageElement: function() {
9099  var messageElement = document.createElement("DIV");
9100  messageElement.id = this.pronouncerId;
9101  ASPx.Attr.SetAttribute(messageElement, "role", "note");
9102  this.focusableMessageElement.appendChild(messageElement);
9103  this.messageElement = messageElement;
9104 },
9105 getMessage: function(messagePartsArg) {
9106  var messageParts = messagePartsArg.filter(function(x) { return ASPx.IsExists(x); });
9107  return messageParts.join(", ");
9108 }
9109});
9110var AccessibilityPronouncerBase = ASPx.CreateClass(null, {
9111 constructor: function() {
9112  this.state = { };
9113 },
9114 Pronounce: function(args) {
9115  var messageElement = this.getMessageElement();
9116  ASPx.Attr.Aria.SetOrRemoveLabel(messageElement);
9117  ASPx.SetInnerHtml(messageElement, "");
9118  this.PronounceCore(args);
9119 },
9120 PronounceCore: function(args) { },
9121 SaveElementState: function(element) { 
9122  if(this.state[element.id])
9123   return;
9124  this.state[element.id] = {
9125   element: element,
9126   descendant: ASPx.Attr.GetAttribute(element, ASPx.Attr.Aria.descendant)
9127  };
9128 },
9129 RemoveState: function() {
9130  this.state = { };
9131 },
9132 RestoreControlState: function(mainElement) { 
9133  for(var elementInfo in this.state) {
9134   if(this.state.hasOwnProperty(elementInfo)) {
9135    var element = this.state[elementInfo].element;
9136    if(!mainElement || ASPx.GetIsParent(mainElement, element))
9137     this.RestoreElementState(element);
9138   }
9139  }
9140 },
9141 RestoreElementsState: function(elements) { 
9142  for(var i = 0; i < elements.length; i++)
9143   this.RestoreElementState(elements[i]);
9144 },
9145 RestoreElementState: function(element) {
9146  var elementState = this.state[element.id];
9147  if(!elementState)
9148   return;
9149  ASPx.Attr.Aria.SetOrRemoveDescendant(element, elementState.descendant);
9150  delete this.state[element.id];
9151 },
9152 getMessage: function(args) {
9153  return ASPx.AccessibilityPronouncer.getMessage(args.messageParts);
9154 },
9155 getMessageElement: function() {
9156  return ASPx.AccessibilityPronouncer.messageElement;
9157 },
9158 getFocusableMessageElement: function() {
9159   return ASPx.AccessibilityPronouncer.focusableMessageElement;
9160 }
9161});
9162var AccessibilityLivePronouncer = ASPx.CreateClass(AccessibilityPronouncerBase, {
9163 constructor: function() {
9164  this.constructor.prototype.constructor.call(this);
9165 },
9166 PronounceCore: function(args) {
9167  var message = this.getMessage(args);
9168  var messageElement = this.getMessageElement();
9169  ASPx.Attr.SetAttribute(this.getFocusableMessageElement(), "aria-live", "assertive");
9170  ASPx.Attr.Aria.SetAtomic(this.getFocusableMessageElement(), "true");
9171  ASPx.SetInnerHtml(messageElement, ASPx.Str.EncodeHtml(message));
9172 }
9173});
9174var AccessibilityDescendantPronouncer = ASPx.CreateClass(AccessibilityPronouncerBase, {
9175 constructor: function() {
9176  this.constructor.prototype.constructor.call(this);
9177 },
9178 PronounceCore: function(args) {
9179  var message = this.getMessage(args);
9180  var activeElement = ASPx.GetActiveElement();
9181  var messageElement = this.getMessageElement();
9182  this.SaveElementState(activeElement);
9183  ASPx.Attr.RemoveAttribute(this.getFocusableMessageElement(), "aria-live");
9184  ASPx.Attr.RemoveAttribute(this.getFocusableMessageElement(), "aria-atomic");
9185  ASPx.Attr.Aria.SetOrRemoveLabel(messageElement, message);
9186  ASPx.Attr.Aria.SetOrRemoveDescendant(activeElement, messageElement.id);
9187 }
9188});
9189ASPx.AccessibilityPronouncerType = {
9190 live: "live",
9191 descendant: "descendant"
9192};
9193ASPx.AccessibilityPronouncer = new AccessibilityPronouncer();
9194var RestoreFocusHelper = ASPx.CreateClass(null, {
9195 constructor: function() {
9196  this.excludedIDs = [ "DXCBtn" ]; 
9197  this.pronouncerType = ASPx.AccessibilityPronouncerType.live;
9198  this.callbackQueue = [];
9199  this.Initialize();
9200 },
9201 Initialize: function() {
9202  var that = this;
9203  ASPx.attachToLoad(function() {
9204   ASPxClientControl.GetControlCollection().BeginCallback.AddHandler(that.OnBeginCallback, that);
9205   ASPxClientControl.GetControlCollection().EndCallback.AddHandler(that.OnEndCallback, that);
9206  });
9207 },
9208 OnBeginCallback: function(s, e) {
9209  var control = e.control;
9210  if(!control.allowRestoreFocusOnCallbacks())
9211   return;
9212  control.accessibilityFocusTreeLine = this.getFocusTreeLine(control);
9213  var controlHasCallbackTreeLine = this.callbackQueueContainsTreeLine(control);
9214  this.pushTreeLineInfoIntoCallbackQueue(control);
9215  if(control.accessibilityFocusTreeLine && !controlHasCallbackTreeLine)
9216   control.SendMessageToAssistiveTechnology(this.getDefaultCallbackMessage());
9217 },
9218 OnEndCallback: function(s, e) {
9219  var control = e.control;
9220  if(!control.allowRestoreFocusOnCallbacks())
9221   return;
9222  var treeLineInfo = this.shiftTreeLineInfoFromCallbackQueue(control);
9223  if(treeLineInfo.queueLength == 0) {
9224   if(!control.accessibilityFocusTreeLine && treeLineInfo.treeLine)
9225    control.accessibilityFocusTreeLine = treeLineInfo.treeLine;
9226   var focusElement = this.findFocusElement(control);
9227   var focusIsManagerByPopupwindow = this.isFocusManagedByActivePopupWindow(focusElement);
9228   var focusIsManagedByControl = control.shouldPreventFocusRestoringOnCallback && control.shouldPreventFocusRestoringOnCallback();
9229   if(!focusIsManagerByPopupwindow && !focusIsManagedByControl)
9230    ASPx.AccessibilityUtils.SetFocusAccessible(focusElement);
9231   delete control.accessibilityFocusTreeLine;
9232  }
9233 },
9234 pushTreeLineInfoIntoCallbackQueue: function(control) {
9235  var controlTreeLine = control.accessibilityFocusTreeLine ? control.accessibilityFocusTreeLine.slice(0) : null;
9236  if(!this.callbackQueue[control.name])
9237   this.callbackQueue[control.name] = [];
9238  this.callbackQueue[control.name].push(controlTreeLine);
9239 },
9240 shiftTreeLineInfoFromCallbackQueue: function(control) {
9241  var treeLineInfo = { queueLength: 0, treeLine: null };
9242  var treeLines = this.callbackQueue[control.name];
9243  if(treeLines && treeLines.length > 0) {
9244   treeLineInfo.treeLine = treeLines.shift();
9245   var linesCount = treeLines.length;
9246   treeLineInfo.queueLength = linesCount;
9247   if(linesCount > 0 && !treeLines[0] && treeLineInfo.treeLine)
9248    treeLines[0] = treeLineInfo.treeLine.slice(0);
9249  }
9250  return treeLineInfo;
9251 },
9252 callbackQueueContainsTreeLine: function(control) {
9253  var treeLines = this.callbackQueue[control.name];
9254  if(!treeLines || treeLines.length == 0) 
9255   return false;
9256  if(treeLines[treeLines.length - 1])
9257   return true;
9258  return false;
9259 },
9260 getDefaultCallbackMessage: function() {
9261  return ASPx.AccessibilitySR.DefaultCallbackMessage;
9262 },
9263 isFocusManagedByActivePopupWindow: function(focusElement) {
9264  var popupControl = this.getActivePopupControl();
9265  if(!popupControl || popupControl.accessibleFocusElement)
9266   return false;
9267  this.initializePopupAccessibleFocusElement(popupControl, focusElement);
9268  return popupControl.setFocusOnCallback;
9269 },
9270 getActivePopupControl: function() {
9271  var activePopupWindow = ASPx.GetPopupControlCollection && ASPx.GetPopupControlCollection().GetCurrentActiveWindowElement();
9272  if(!activePopupWindow)
9273   return null;
9274  var popupInfo = ASPx.GetPopupControlCollection().GetPopupWindowFromID(activePopupWindow.id);
9275  return popupInfo.popupControl;
9276 },
9277 initializePopupAccessibleFocusElement: function(popupControl, focusElement) {
9278  if(popupControl.setFocusOnCallback)
9279   popupControl.accessibleFocusElement = focusElement;
9280  else {
9281   var parentControl = popupControl.GetParentControl();
9282   if(parentControl && parentControl.GetMainElement())
9283    popupControl.accessibleFocusElement = ASPx.FindFirstChildActionElement(parentControl.GetMainElement());
9284  }
9285 },
9286 getFocusTreeLine: function(control) {
9287  var element = ASPx.GetActiveElement();
9288  if(!ASPx.IsExistsElement(element))
9289   return null;
9290  var mainElement = control.GetMainElement();
9291  if(!ASPx.GetIsParent(mainElement, element)) {
9292   var treeInfo = this.findFocusedControlElement(mainElement, element);
9293   element = treeInfo.focusElement;
9294   mainElement = treeInfo.rootElement;
9295  }
9296  return this.getTreeLineCore(mainElement, element);
9297 },
9298 getTreeLineCore: function(mainElement, element) {
9299  if(!element) return null;
9300  treeLine = [ ];
9301  while(element) {
9302   treeLine.push({ 
9303    id: element.id,
9304    tagName: element.tagName,
9305    index: ASPx.Data.ArrayIndexOf(element.parentNode.childNodes, element)
9306   });
9307   if(element === mainElement || element === document.body)
9308    break;
9309   element = element.parentNode;
9310  }
9311  return treeLine;
9312 },
9313 findFocusedControlElement: function(mainElement, activeElement) {
9314  var element = null;
9315  var parentElement = mainElement;
9316  var focusedEditor = ASPx.IsExists(ASPx.GetFocusedEditor) ? ASPx.GetFocusedEditor() : null;
9317  if(focusedEditor && ASPx.GetIsParent(mainElement, focusedEditor.GetMainElement()))
9318   element = focusedEditor.GetFocusableInputElement();
9319  else {
9320   if(mainElement && activeElement) {
9321    var mainControl = ASPx.GetClientControlByElementID(mainElement.id);
9322    var parentControls = ASPx.GetParentClientControls(activeElement.id);
9323    for(var i = parentControls.length - 1; i > -1; i--) {   
9324     if(mainControl.name == parentControls[i].name) {
9325      element = activeElement;
9326      var rootIndex = i > 0 ? i - 1 : i;
9327      parentElement = parentControls[rootIndex].GetMainElement();
9328      if(!parentElement && parentControls[rootIndex].GetCurrentWindowElement)
9329       parentElement = parentControls[rootIndex].GetCurrentWindowElement();
9330      break;
9331     }
9332    }
9333   }
9334  }
9335  return { focusElement: element, rootElement: parentElement }; 
9336 },
9337 findFocusElement: function(control) {
9338  if(!control.accessibilityFocusTreeLine)
9339   return;
9340  var treeLine = control.accessibilityFocusTreeLine.slice(0);
9341  var focusElementParent = this.findFocusElementParentById(treeLine);
9342  if(!focusElementParent) 
9343   return;
9344  return this.findFocusElementFromDOMTree(treeLine, focusElementParent);
9345 },
9346 findFocusElementParentById: function(treeLine) {
9347  for(var i = 0; i < treeLine.length; i++) {
9348   var id = treeLine[i].id;
9349   if(!this.isValidId(id))
9350    continue;
9351   var element = document.getElementById(id);
9352   if(element) {
9353    treeLine.splice(i, treeLine.length - i);
9354    treeLine.reverse();
9355    return element;
9356   }
9357  }
9358  return null;
9359 },
9360 findFocusElementFromDOMTree: function(treeLine, focusElementParent) {
9361  var element = focusElementParent;
9362  for(var i = 0; i < treeLine.length; i++) {
9363   var info = treeLine[i];
9364   if(info.index >= element.childNodes.length) {
9365    element = element.childNodes.length > 0 ? element.childNodes[element.childNodes.length - 1] : null;
9366    return this.findNeighbourFocusElement(element, focusElementParent);
9367   }
9368   var child = element.childNodes[info.index];
9369   if(child.tagName !== info.tagName)
9370    return this.findNeighbourFocusElement(child, focusElementParent);
9371   element = child;
9372  }
9373  return element;
9374 },
9375 findNeighbourFocusElement: function(element, focusElementParent) {
9376  ASPx.ActionElementsCache.BeginUsage();
9377  var result = this.findNeighbourFocusElementCore(element, focusElementParent);
9378  ASPx.ActionElementsCache.EndUsage();
9379  return result;
9380 },
9381 findNeighbourFocusElementCore: function(element, focusElementParent) {
9382  if(!element || !element.parentNode) return null;
9383  var neighbours = element.parentNode.childNodes;
9384  var indices = this.calcLeftRightIndices(ASPx.Data.ArrayIndexOf(neighbours, element), neighbours.length);
9385  for(var i = 0; i < indices.length; i++) {
9386   var index = indices[i];
9387   var actionElement = ASPx.FindFirstChildActionElement(neighbours[index]);
9388   if(actionElement)
9389    return actionElement;
9390  }
9391  if(element === focusElementParent)
9392   return null;
9393  return this.findNeighbourFocusElement(element.parentNode, focusElementParent);
9394 },
9395 calcLeftRightIndices: function(startIndex, count) {
9396  var indices = [ ];
9397  var incSides = [ 0, 0 ];
9398  var index = startIndex;
9399  for(var i = 0; i < count; i++) {
9400   indices.push(index);
9401   var even = i % 2 === 0;
9402   var nextIndex = this.calcNextIndex(startIndex, count, incSides, even);
9403   if(nextIndex < 0)
9404    nextIndex = this.calcNextIndex(startIndex, count, incSides, !even);
9405   index = nextIndex;
9406  }
9407  return indices;
9408 },
9409 calcNextIndex: function(startIndex, count, incSides, even) {
9410  var sideIndex = even ? 0 : 1;
9411  var inc = incSides[sideIndex];
9412  inc += even ? -1 : 1;
9413  var nextIndex = startIndex + inc;
9414  if(nextIndex >= 0 && nextIndex < count) {
9415   incSides[sideIndex] = inc;
9416   return nextIndex;
9417  }
9418  return -1;
9419 },
9420 isValidId: function(id) {
9421  return id && !this.isExcludedId(id);
9422 },
9423 isExcludedId: function(id) {
9424  var result = false;
9425  for(var i = 0; i < this.excludedIDs.length; i++) {
9426   if(id.indexOf(this.excludedIDs[i]) > -1) {
9427    result = true;
9428    break;
9429   }
9430  }
9431  return result;
9432 }
9433});
9434var EventStorage = ASPx.CreateClass(null, {
9435 constructor: function() {
9436  this.bag = { };
9437 },
9438 Save: function(e, data, overwrite) {
9439  var key = this.getEventKey(e);
9440  if(this.bag.hasOwnProperty(key) && !overwrite)
9441   return;
9442  this.bag[key] = data;
9443  window.setTimeout(function() { delete this.bag[key]; }.aspxBind(this), 100);
9444 },
9445 Load: function(e) {
9446  var key = this.getEventKey(e);
9447  return this.bag[key];
9448 },
9449 getEventKey: function(e) {
9450  if(ASPx.IsExists(e.timeStamp))
9451   return e.timeStamp.toString();
9452  var eventSource = ASPx.Evt.GetEventSource(e);
9453  var type = e.type.toString();
9454  return eventSource ? type + "_" + eventSource.uniqueID.toString() : type;
9455 }
9456});
9457ASPx.RestoreFocusHelper = new RestoreFocusHelper();
9458EventStorage.Instance = null;
9459EventStorage.getInstance = function() {
9460 if(!EventStorage.Instance)
9461  EventStorage.Instance = new EventStorage();
9462 return EventStorage.Instance;
9463};
9464var GetGlobalObject = function(objectName) {
9465 var fields = objectName.split('.');
9466 var obj = window[fields[0]];
9467 for(var i = 1;
9467 obj && i < fields.length; i++) {
9468  obj = obj[fields[i]];
9469 }
9470 return obj;
9471};
9472var GetExternalScriptProcessor = function() {
9473 return ASPx.ExternalScriptProcessor ? ASPx.ExternalScriptProcessor.getInstance() : null;
9474};
9475var SAVED_WIDTH_ATTR = "data-dx-ripple-saved-width";
9476var RIPPLE_FIXED_ROW_ATTR = "data-dx-ripple-locked";
9477var READ_ONLY_COMBOBOX_MARKER_CSS_CLASS = "dxICBReadonlyMarker";
9478var ThemesWithRipple = ['Material'];
9479var RippleHelper = {
9480 rippleTargetClassName: "dxRippleTarget",
9481 rippleTargetExternalClassName: "dxRippleTargetExternal",
9482 rippleContainerClassName: "dxRippleContainer",
9483 rippleClassName: "dxRipple",
9484 touchRadius: -1,
9485 isMobileExternalRipple: null,
9486 zoom: 1,
9487 Init: function() {
9488  if(this.getIsRippleFunctionalityEnabled()) {
9489   setTimeout(function() {
9490    this.calcTouchRadius();
9491   }.aspxBind(this), 0);
9492  }
9493 },
9494 calcTouchRadius: function() {
9495  var testBlock = document.createElement("DIV");
9496  ASPx.SetStyles(testBlock, {
9497   height: "1in",
9498   width: "1in",
9499   left: "-100%",
9500   top: "-100%",
9501   position: "absolute"
9502  });
9503  document.body.appendChild(testBlock);
9504  this.touchRadius = (1.8 / 2.54) * Math.max(testBlock.offsetWidth, testBlock.offsetHeight);
9505  document.body.removeChild(testBlock);
9506 },
9507 isRippleFunctionalityEnabled: null,
9508 checkRippleFunctionality: function() {
9509  if(ASPx.Browser.Safari && ASPx.Browser.Version <= 5.1)
9510   return false;
9511  for(var i = 0; i < ThemesWithRipple.length; i++) {
9512   var firstRippleThemeElement = document.querySelector("[class*='_" + ThemesWithRipple[i] + "']");
9513   if(firstRippleThemeElement)
9514    return true;
9515  }  
9516  return false;
9517 },
9518 ReInit: function() {
9519  this.isRippleFunctionalityEnabled = null;
9520  this.Init();
9521 },
9522 onDocumentMouseDown: function(evt) {
9523  if(RippleHelper.getIsRippleFunctionalityEnabled())
9524   RippleHelper.processMouseDown(evt);
9525 },
9526 getIsRippleFunctionalityEnabled: function() {
9527  if(!ASPx.IsExists(this.isRippleFunctionalityEnabled))
9528   this.isRippleFunctionalityEnabled = this.checkRippleFunctionality();
9529  return this.isRippleFunctionalityEnabled;
9530 },
9531   createTargetInfo: function(target) {
9532  return { 
9533   x: ASPx.GetAbsoluteX(target),
9534   y: ASPx.GetAbsoluteY(target),
9535   width: target.offsetWidth,
9536   height: target.offsetHeight,
9537   classNames: ASPx.GetClassNameList(target),
9538   getTarget: function() { return target; },
9539   getRect: function() { return {x: this.x, y: this.y, width: this.width, height: this.height }; }
9540  };
9541 },
9542 createEventInfo: function(evt) {
9543  return { x: this.getEventX(evt), y: this.getEventY(evt) };
9544 },
9545 processMouseDown: function(evt) {
9546  var evtSource = ASPx.Evt.GetEventSource(evt);
9547  var rippleTarget = this.getRippleTargetElement(evtSource);
9548  if(this.needToProcessRipple(rippleTarget, evtSource))
9549   this.processRipple(this.createTargetInfo(rippleTarget), this.createEventInfo(evt));
9550 },
9551 getRippleTargetElement: function(evtSource) {
9552  if(this.hasRippleMarker(evtSource))
9553   return evtSource;
9554  if(evtSource.tagName && evtSource.tagName.toLowerCase() == "input" && ASPx.ElementContainsCssClass(evtSource, "dxTI")) {
9555   var elements = ASPx.GetChildElementNodesByPredicate(evtSource.parentNode.parentNode, function(element) {
9556    return this.hasRippleMarker(element);
9557   }.aspxBind(this));
9558   return elements && elements[0];
9559  }
9560  return ASPx.GetParent(evtSource, function(element) {
9561   return this.hasRippleMarker(element);
9562  }.aspxBind(this));
9563 },
9564 hasRippleMarker: function(element) {
9565  if(!ASPx.IsExistsElement(element))
9566   return false;
9567  var computedStyles = window.getComputedStyle(element, ":before");
9568  if(ASPx.IsExists(computedStyles)) {
9569   var content = computedStyles.getPropertyValue("content");
9570   if(content.indexOf(this.rippleTargetExternalClassName) > -1) {
9571    ASPx.AddClassNameToElement(element, this.rippleTargetExternalClassName);
9572    return true;
9573   }
9574   return content.indexOf(this.rippleTargetClassName) > -1;
9575  }
9576  return false;
9577 },
9578 needToProcessRipple: function(rippleTarget, evtSource) {
9579  if(!rippleTarget || !ASPx.AnimationUtils)
9580   return false;
9581  var isClearButton = ASPx.ElementContainsCssClass(rippleTarget, "dxeButton") && rippleTarget.id && rippleTarget.id.indexOf("B-100") !== -1;
9582  var isEmptyCalendarDay = ASPx.ElementContainsCssClass(rippleTarget, "dxeCalendarDay") && ASPx.Str.Trim(rippleTarget.textContent) == "";
9583  var isReadonly = ASPx.ElementContainsCssClass(rippleTarget, READ_ONLY_COMBOBOX_MARKER_CSS_CLASS);
9584  var tempFixDisable = ASPx.ElementContainsCssClass(rippleTarget, "dxSwitcher") && ASPx.Browser.MacOSMobilePlatform;
9585  var rippleIsForbidden = isReadonly || isClearButton || isEmptyCalendarDay || ASPx.GetParentByPartialClassName(rippleTarget, "Disabled") ||
9586   ASPx.ElementContainsCssClass(rippleTarget, "dxgvBatchEditCell") || ASPx.ElementContainsCssClass(rippleTarget, "dxcvEditForm") ||
9587   ASPx.GetParentByPartialClassName(evtSource, "dxcvFocusedCell") || tempFixDisable;
9588  return !rippleIsForbidden;
9589 },
9590 hasBothOverflow: function(style) {
9591  return style.overflow == "scroll" || style.overflow == "auto" || style.overflow == "hidden";
9592 },
9593 hasOverflowX: function(style) {
9594  return style.overflowX == "scroll" || style.overflowX == "auto" || style.overflowX == "hidden";
9595 },
9596 hasOverflowY: function(style) {
9597  return style.overflowY == "scroll" || style.overflowY == "auto" || style.overflowY == "hidden";
9598 },
9599 getExternalRippleContainerSize: function(targetRect) {
9600  if(ASPx.Browser.MobileUI) {
9601   var origTouchRadius = this.getOriginTouchRadius();
9602   if(origTouchRadius < targetRect.width || origTouchRadius < targetRect.height)
9603    origTouchRadius = Math.max(targetRect.width, targetRect.height);
9604   return {x: targetRect.x + (targetRect.width - origTouchRadius) / 2, y: targetRect.y + (targetRect.height - origTouchRadius) / 2, width: origTouchRadius, height: origTouchRadius };
9605  }
9606  var result = { x: 0, y: 0, width: 0, height: 0 };
9607  var diff = targetRect.width - targetRect.height;
9608  if(diff > 0) {
9609   result.x = targetRect.x;
9610   result.y = targetRect.y - diff / 2;
9611   result.width = targetRect.width;
9612   result.height = targetRect.width;
9613  } else {
9614   result.x = targetRect.x + diff / 2;
9615   result.y = targetRect.y;
9616   result.width = targetRect.height;
9617   result.height = targetRect.height;
9618  }
9619  return result;
9620 },
9621 getInternalContainerSize: function(targetInfo) {
9622  var parentWithOverflow = RippleHelper.getParentWithOverflow(targetInfo.getTarget());
9623  if(!ASPx.IsExists(parentWithOverflow))
9624   return targetInfo;
9625  var parentWithOverflowStyle = ASPx.GetCurrentStyle(parentWithOverflow);
9626  var bothOverflow = this.hasBothOverflow(parentWithOverflowStyle);
9627  var overflowX = this.hasOverflowX(parentWithOverflowStyle);
9628  var overflowY = this.hasOverflowY(parentWithOverflowStyle);
9629  var parentRect = {
9630   x: ASPx.GetAbsoluteX(parentWithOverflow),
9631   y: ASPx.GetAbsoluteY(parentWithOverflow),
9632   width: parentWithOverflow.offsetWidth,
9633   height: parentWithOverflow.offsetHeight
9634  };
9635  return this.getInternalContainerSizeCore(targetInfo, parentRect, bothOverflow, overflowX, overflowY);
9636 },
9637 getInternalContainerSizeCore: function(targetRect, parentRect, bothOverflow, overflowX, overflowY) {
9638  var result = {};
9639  ASPx.Data.MergeHashTables(result, targetRect);
9640  if(bothOverflow || overflowX) {
9641   result.x = targetRect.x < parentRect.x ? parentRect.x : targetRect.x;
9642   if(targetRect.x + targetRect.width > parentRect.x + parentRect.width)
9643    result.width = parentRect.x + parentRect.width - targetRect.x;
9644   if(parentRect.x > targetRect.x)
9645    result.width -= (parentRect.x - targetRect.x);
9646  }
9647  if(bothOverflow || overflowY) {
9648   result.y = targetRect.y < parentRect.y ? parentRect.y : targetRect.y;
9649   if(targetRect.y + targetRect.height > parentRect.y + parentRect.height)
9650    result.height = parentRect.y + parentRect.height - targetRect.y;
9651   if(parentRect.y > targetRect.y)
9652    result.height -= (parentRect.y - targetRect.y);
9653  }
9654  return result;
9655 },
9656 calculateRippleContainerSize: function(targetInfo, isExternalRipple) {
9657  return isExternalRipple ? this.getExternalRippleContainerSize(targetInfo) : this.getInternalContainerSize(targetInfo);
9658 },
9659 getParentWithOverflow: function(rippleTarget) {
9660  var result = ASPx.GetParent(rippleTarget, function(element) {
9661   var elementStyle = ASPx.GetCurrentStyle(element);
9662   return this.hasBothOverflow(elementStyle) || this.hasOverflowX(elementStyle) || this.hasOverflowY(elementStyle);
9663  }.aspxBind(this));
9664  return result;
9665 },
9666 getDuration: function(targetInfo) {
9667  return this.IsExternalRipple(targetInfo) || ASPx.Browser.MobileUI ? 650 : 450;
9668 },
9669 createRippleTransition: function(container, rippleElement, radius, targetInfo) {
9670  var rippleSize = 2 * radius;
9671  var transitionProperties = {
9672   width: { from: 0, to: rippleSize, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "width", unit: "px" },
9673   height: { from: 0, to: rippleSize, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "height", unit: "px" },
9674   marginLeft: { from: 0, to: -rippleSize / 2, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "marginLeft", unit: "px" },
9675   marginTop: { from: 0, to: -rippleSize / 2, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "marginTop", unit: "px" },
9676   opacity: { from: 1, to: 0.05, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "o
9676pacity", unit: "%" }
9677  };
9678  var rippleTransition = ASPx.AnimationUtils.createMultipleAnimationTransition(rippleElement, {
9679   transition: ASPx.AnimationConstants.Transitions.RIPPLE,
9680   duration: this.getDuration(targetInfo),
9681   needForceTransitionEndByTimerFlag: true, 
9682   onComplete: function() {
9683    this.RemoveRippleContainer(container.parentElement);
9684   }.bind(this)
9685  });
9686  rippleTransition.Start(transitionProperties);
9687 },
9688 needForceTransitionEndByTimer: function() { return true; }, 
9689 calculateRadius: function(isExternalRipple, posX, posY, containerRect) {
9690  var radius = -1;
9691  if(isExternalRipple) {
9692   if(ASPx.Browser.MobileUI)
9693    radius = this.getOriginTouchRadius() / 2;
9694   else
9695    radius = Math.max(containerRect.height, containerRect.width);
9696  } else {
9697   var width1 = posX - containerRect.x;
9698   var width2 = containerRect.width - width1;
9699   var height1 = posY - containerRect.y;
9700   var height2 = containerRect.height - height1;
9701   var rippleWidth = Math.max(width1, width2);
9702   var rippleHeight = Math.max(height1, height2);
9703   radius = Math.sqrt(Math.pow(rippleHeight, 2) + Math.pow(rippleWidth, 2));
9704  }
9705  return radius;
9706 },
9707 createRippleElement: function(container, rippleCenter) {
9708  var rippleElement = document.createElement("DIV");
9709  rippleElement.className = this.rippleClassName;
9710  container.appendChild(rippleElement);
9711  ASPxClientUtils.SetAbsoluteX(rippleElement, rippleCenter.x);
9712  ASPxClientUtils.SetAbsoluteY(rippleElement, rippleCenter.y);
9713  return rippleElement;
9714 },
9715 processRipple: function(targetInfo, eventInfo) {
9716  this.initRippleProcess();
9717  var isExternalRipple = this.IsExternalRipple(targetInfo);
9718  var rippleCenter = this.getRippleCenter(targetInfo.getRect(), eventInfo, isExternalRipple);
9719  var container = this.createRippleContainer(targetInfo, isExternalRipple);
9720  var rippleElement = this.createRippleElement(container, rippleCenter);
9721  var radius = this.calculateRadius(isExternalRipple, rippleCenter.x, rippleCenter.y, this.getElementRect(container));
9722  this.createRippleTransition(container, rippleElement, radius, targetInfo);
9723 },
9724 initRippleProcess: function() {
9725  this.isMobileExternalRipple = null;
9726  this.zoom = screen.width / window.innerWidth;
9727 },
9728 getRippleCenter: function(targetInfo, eventInfo, isExternalRipple) {
9729  var posX = 0;
9730  var posY = 0;
9731  if(isExternalRipple) {
9732   posX = targetInfo.x + targetInfo.width / 2;
9733   posY = targetInfo.y + targetInfo.height / 2;
9734  } else {
9735   posX = eventInfo.x;
9736   posY = eventInfo.y;
9737  }
9738  return {x: posX, y: posY};
9739 },
9740 createRippleContainer: function(targetInfo, isExternalRipple) {
9741  var containerParent = targetInfo.getTarget();
9742  if(!containerParent)
9743   return;
9744  var containerTagName = containerParent.tagName == "TR" ? "TD" : "DIV";
9745  var container = document.createElement(containerTagName);
9746  container.className = this.rippleContainerClassName;
9747  if(containerParent.parentNode && containerParent.tagName == "IMG")
9748   containerParent = containerParent.parentNode;
9749  if(this.isARowInFixedLayoutTable(containerParent))
9750   this.lockFixedLayoutTableSizes(containerParent);
9751  containerParent.appendChild(container);
9752  if(isExternalRipple)
9753   container.style.borderRadius = "50%";
9754  var containerRect = this.calculateRippleContainerSize(targetInfo, isExternalRipple);
9755  this.assignContainerSettings(container, containerRect);
9756  return container;
9757 },
9758 isARowInFixedLayoutTable: function(containerParent) {
9759  if(containerParent.tagName !== "TR")
9760   return false;
9761  var parentTable = this.getParentTable(containerParent);
9762  return parentTable && ASPx.GetCurrentStyle(parentTable)["table-layout"] === "fixed";
9763 },
9764 processFirstRowOfFixedTable: function(containerRow, rowAction, cellAction) {
9765  var firstRow = this.getFirstRow(containerRow);
9766  rowAction(firstRow);
9767  var cells = ASPx.Data.CollectionToArray(firstRow.cells);
9768  cells.forEach(cellAction);
9769 },
9770 getParentTable: function(element) {
9771  var parentTable = element;
9772  while(parentTable && parentTable.tagName !== "TABLE")
9773   parentTable = parentTable.parentElement;
9774  return parentTable;
9775 },
9776 lockFixedLayoutTableSizes: function(containerRow) {
9777  var firstRow = this.getFirstRow(containerRow);
9778  if(this.incLockCount(firstRow) === 1) {
9779   var cells = ASPx.Data.CollectionToArray(firstRow.cells);
9780   var widths = cells.map(function(cell) { return cell.style.width; });
9781   var computedWidths = cells.map(function(cell) {
9782    return window.getComputedStyle(cell).width;
9783   });
9784   var fixWidth = function(cell, i) {
9785    if(ASPx.Attr.IsExistsAttribute(cell, SAVED_WIDTH_ATTR))
9786     return;
9787    if(widths[i])
9788     ASPx.Attr.SetAttribute(cell, SAVED_WIDTH_ATTR, widths[i]);
9789    cell.style.width = computedWidths[i];
9790   };
9791   cells.forEach(fixWidth);
9792  }
9793 }, 
9794 unlockFixedLayoutTableSizes: function(containerRow) {
9795  var firstRow = this.getFirstRow(containerRow);   
9796  if(this.decLockCount(firstRow) === 0) {
9797   var cells = ASPx.Data.CollectionToArray(firstRow.cells);
9798   var restoreState = function(cell) {
9799    if(ASPx.Attr.IsExistsAttribute(cell, SAVED_WIDTH_ATTR)) {
9800     cell.style.width = ASPx.Attr.GetAttribute(cell, SAVED_WIDTH_ATTR);
9801     ASPx.Attr.RemoveAttribute(cell, SAVED_WIDTH_ATTR);
9802    } else {
9803     cell.style.width = null;
9804    }
9805   };
9806   cells.forEach(restoreState);
9807  }
9808 },
9809 getFirstRow: function(containerRow) { return ASPx.GetChildByTagName(containerRow.parentElement, "TR", 0); },
9810 incLockCount: function(elem) { return this.changeLockCount(elem, 1); },
9811 decLockCount: function(elem) { return this.changeLockCount(elem, -1); },
9812 changeLockCount: function(elem, diff) {
9813  var lockCounter = this.getLockCount(elem);
9814  lockCounter += diff;
9815  lockCounter = Math.max(0, lockCounter);
9816  if(lockCounter === 0)
9817   ASPx.Attr.RemoveAttribute(elem, RIPPLE_FIXED_ROW_ATTR);
9818  else
9819   ASPx.Attr.SetAttribute(elem, RIPPLE_FIXED_ROW_ATTR, lockCounter);
9820  return lockCounter;
9821 },
9822 getLockCount: function(lockElement) {
9823  var attrValue = ASPx.Attr.GetAttribute(lockElement, RIPPLE_FIXED_ROW_ATTR);
9824  return parseInt(attrValue) || 0;
9825 },
9826 assignContainerSettings: function(container, containerRect) {
9827  var properties = {
9828   height: containerRect.height,
9829   width: containerRect.width,
9830   left: ASPx.PrepareClientPosForElement(containerRect.x, container, true),
9831   top: ASPx.PrepareClientPosForElement(containerRect.y, container, false)
9832  };
9833  if(ASPx.Browser.MobileUI)
9834   ASPx.Data.MergeHashTables(properties, {marginTop: 0, marginLeft: 0 });
9835  ASPx.SetStyles(container, properties, ASPx.Browser.MobileUI);
9836 },
9837 IsExternalRipple: function(targetInfo) {
9838  var hasExternalRippleClassName = ASPx.ElementContainsCssClass(targetInfo.getTarget(), this.rippleTargetExternalClassName);
9839  if(!ASPx.Browser.MobileUI)
9840   return hasExternalRippleClassName;
9841  return hasExternalRippleClassName || this.IsMobileExternalRipple(targetInfo);
9842 },
9843 IsMobileExternalRipple: function(targetInfo) {
9844  if(this.isMobileExternalRipple == null) {
9845   var originTouchRadius = this.getOriginTouchRadius();
9846   this.isMobileExternalRipple = ASPx.Browser.MobileUI && targetInfo.width < originTouchRadius && targetInfo.height < originTouchRadius;
9847  }
9848  return this.isMobileExternalRipple;
9849 },
9850 RemoveRippleContainer: function(element) {
9851  if(!element)
9852   return;
9853  var childs = ASPx.GetChildNodesByClassName(element, this.rippleContainerClassName);
9854  var rippleContainer = childs.length > 0 ? childs[0] : null;
9855  if(rippleContainer != null) {
9856   var containerParent = rippleContainer.parentNode;
9857   containerParent.removeChild(rippleContainer);
9858   if(this.isARowInFixedLayoutTable(containerParent))
9859    this.unlockFixedLayoutTableSizes(containerParent);
9860  }
9861 },
9862 getEventX: function(evt) {
9863  return ASPxClientUtils.GetEventX(evt);
9864 },
9865 getEventY: function(evt) {
9866  return ASPxClientUtils.GetEventY(evt);
9867 },
9868 getOriginTouchRadius: function() {
9869  return this.touchRadius / this.zoom;
9870 },
9871 getElementRect: function(element) {
9872  return { x: ASPx.GetAbsoluteX(element), y: ASPx.GetAbsoluteY(element), width: element.offsetWidth, height: element.offsetHeight };
9873 }
9874};
9875var AccessibilitySR = {
9876 AddStringResources: function(stringResourcesObj) {
9877  if(stringResourcesObj) {
9878   for(var key in stringResourcesObj)
9879    if(stringResourcesObj.hasOwnProperty(key))
9880     this[key] = stringResourcesObj[key];
9881  }
9882 }
9883};
9884ASPx.OrderedMap = OrderedMap;
9885ASPx.CollectionBase = CollectionBase;
9886ASPx.FunctionIsInCallstack = _aspxFunctionIsInCallstack;
9887ASPx.RaisePostHandlerOnPost = aspxRaisePostHandlerOnPost;
9888ASPx.GetPostHandler = aspxGetPostHandler;
9889ASPx.ProcessScriptsAndLinks = _aspxProcessScriptsAndLinks;
9890ASPx.InitializeLinks = _aspxInitializeLinks;
9891ASPx.InitializeScripts = _aspxInitializeScripts;
9892ASPx.RunStartupScripts = _aspxRunStartupScripts;
9893ASPx.IsStartupScriptsRunning = _aspxIsStartupScriptsRunning;
9894ASPx.AddScriptsRestartHandler = _aspxAddScriptsRestartHandler;
9895ASPx.GetFocusedElement = _aspxGetFocusedElement;
9896ASPx.GetDomObserver = _aspxGetDomObserver;
9897ASPx.CacheHelper = CacheHelper;
9898ASPx.ControlTree = ControlTree;
9899ASPx.ControlAdjuster = ControlAdjuster;
9900ASPx.GetControlAdjuster = GetControlAdjuster;
9901ASPx.ControlCallbackHandlersQueue = ControlCallbackHandlersQueue;
9902ASPx.ResourceManager = ResourceManager;
9903ASPx.UpdateWatcherHelper = UpdateWatcherHelper;
9904ASPx.EventStorage = EventStorage;
9905ASPx.GetGlobalObject = GetGlobalObject;
9906ASPx.GetExternalScriptProcessor = GetExternalScriptProcessor;
9907ASPx.CheckBoxCheckState = CheckBoxCheckState;
9908ASPx.CheckBoxInputKey = CheckBoxInputKey;
9909ASPx.CheckableElementStateController = CheckableElementStateController;
9910ASPx.CheckableElementHelper = CheckableElementHelper;
9911ASPx.CheckBoxInternal = CheckBoxInternal;
9912ASPx.CheckBoxInternalCollection = CheckBoxInternalCollection;
9913ASPx.ControlCallbackQueueHelper = ControlCallbackQueueHelper;
9914ASPx.FocusedStyleDecoration = FocusedStyleDecoration;
9915ASPx.EditorStyleDecoration = EditorStyleDecoration;
9916ASPx.TextEditorStyleDecoration = TextEditorStyleDecoration;
9917ASPx.AccessibilitySR = AccessibilitySR;
9918ASPx.KbdHelper = KbdHelper;
9919ASPx.AccessKeysHelper = AccessKeysHelper;
9920ASPx.AccessKey = AccessKey;
9921ASPx.IFrameHelper = IFrameHelper;
9922ASPx.Ident = Ident;
9923ASPx.TouchUIHelper = TouchUIHelper;
9924ASPx.ControlUpdateWatcher = ControlUpdateWatcher;
9925ASPx.ControlTabIndexManager = ControlTabIndexManager;
9926ASPx.AccessibilityHelperBase = AccessibilityHelperBase;
9927ASPx.AccessibilityHelper = AccessibilityHelper;
9928ASPx.RippleHelper = RippleHelper;
9929ASPx.ThemesWithRipple = ThemesWithRipple;
9930ASPx.NetworkError = NetworkError;
9931window.ASPxClientEvent = ASPxClientEvent;
9932window.ASPxClientEventArgs = ASPxClientEventArgs;
9933window.ASPxClientCancelEventArgs = ASPxClientCancelEventArgs;
9934window.ASPxClientProcessingModeEventArgs = ASPxClientProcessingModeEventArgs;
9935window.ASPxClientProcessingModeCancelEventArgs = ASPxClientProcessingModeCancelEventArgs;
9936ASPx.Evt.AttachEventToDocument(TouchUIHelper.touchMouseDownEventName, RippleHelper.onDocumentMouseDown);
9937ASPx.classesScriptParsed = true;
9938})(ASPx, { GCCheckInterval: 5000 });
9939
9940(function () {
9941 IntersectionObserversManager = ASPx.CreateClass(null, {
9942  constructor: function() {
9943   this.rootElementToObserverMap = this.createMap();
9944   this.elementToHandlerMap = this.createMap();
9945   this.clearInvalidElementsInterval = null;
9946   this.clearInvalidElementsPeriod = 5000;
9947  },
9948  AddTargetElement: function(element, rootElement, visibilityChangedHandler) {
9949   this.addTargetElementCore(element, rootElement, visibilityChangedHandler);
9950  },
9951  SubscribeElemensVisibilityChangeInBrowserWindow: function (element, visibilityChangedHandler) {
9952   this.addTargetElementCore(element, null, visibilityChangedHandler);
9953  },
9954  createMap: function() {
9955   return new Map();
9956  },
9957  getObserver: function() {
9958   return IntersectionObserver;
9959  },
9960  initializeObserver: function(rootElement) {
9961   if(!this.rootElementToObserverMap.get(rootElement)) {
9962    var options = {
9963     root: rootElement,
9964     rootMargin: '-1px',
9965     threshold: 0.0 
9966    };
9967    var observerClass = this.getObserver();
9968    var observer = new observerClass(this.visibilityChanged.bind(this), options);
9969    this.rootElementToObserverMap.set(rootElement, observer);
9970   }
9971  },
9972  addTargetElementCore: function(element, rootElement, visibilityChangedHandler) {
9973   this.initializeObserver(rootElement);
9974   if(!this.isAlreadyObserved(element)) {
9975    var observer = this.rootElementToObserverMap.get(rootElement);
9976    if(observer) {
9977     observer.observe(element);
9978     this.setObservedMarker(element);
9979     this.setElementVisibilityChangedHandler(element, visibilityChangedHandler, observer);
9980     if(this.clearInvalidElementsInterval === null) {
9981      this.clearInvalidElementsInterval = setInterval(this.removeDeletedElements.bind(this), this.clearInvalidElementsPeriod);
9982     }
9983    }
9984   }
9985  },
9986  visibilityChanged: function(entries, observer) {
9987   entries.forEach(function (entry) {
9988    if(ASPx.IsExistsElement(entry.target)){
9989     var element = this.elementToHandlerMap.get(observer);
9990     if(element) {
9991      var handler = element.get(entry.target);
9992      if(handler)
9993       handler(entry.isIntersecting);
9994     }
9995    }
9996   }.bind(this));
9997  },
9998  removeDeletedElements: function() {
9999   this.elementToHandlerMap.forEach(function(elements, observer) {
10000    elements.forEach(function(handler, element) {
10001     if(!ASPx.IsExistsElement(element)) {
10002      elements.delete(element);
10003     }
10004    }.bind(this));
10005    if(elements.size === 0) {
10006     this.elementToHandlerMap.delete(observer);
10007    }
10008   }.bind(this));
10009   if(this.elementToHandlerMap.size === 0) {
10010    clearInterval(this.clearInvalidElementsInterval);
10011    this.clearInvalidElementsInterval = null;
10012   }
10013  },
10014  setElementVisibilityChangedHandler: function(element, visibilityChangedHandler, observer) {
10015   if(!this.elementToHandlerMap.get(observer))
10016    this.elementToHandlerMap.set(observer, this.createMap());
10017   var el = this.elementToHandlerMap.get(observer);
10018   if(el)
10019    el.set(element, visibilityChangedHandler);
10020  },
10021  isAlreadyObserved: function(element) {
10022   return !!element.dxObserved;
10023  },
10024  setObservedMarker: function(element) {
10025   element.dxObserved = true;
10026  },
10027  reset: function() {
10028   this.rootElementToObserverMap.forEach(function(observer, rootElement) {
10029    observer.disconnect();
10030   }.bind(this));
10031   this.rootElementToObserverMap = this.createMap();
10032   this.elementToHandlerMap = this.createMap();
10033   this.clearInvalidElementsInterval = null;
10034   this.clearInvalidElementsPeriod = 5000;
10035  }
10036 });
10037 IntersectionObserversManagerForOldBrowsers = ASPx.CreateClass(null, {
10038  SubscribeElemensVisibilityChangeInBrowserWindow: function() { }
10039 });
10040 ASPx.IntersectionObserversManager = ASPx.IntersectionObserversManager || ((typeof(IntersectionObserver) !== "undefined") ? new IntersectionObserversManager() : new IntersectionObserversManagerForOldBrowsers());
10041}
10042)(ASPx);
10043
10044(function () {
10045ASPx.StateItemsExist = false;
10046ASPx.FocusedItemKind = "FocusedStateItem";
10047ASPx.HoverItemKind = "HoverStateItem";
10048ASPx.PressedItemKind = "PressedStateItem";
10049ASPx.SelectedItemKind = "SelectedStateItem";
10050ASPx.DisabledItemKind = "DisabledStateItem";
10051ASPx.ReadOnlyItemKind = "ReadOnlyStateItem";
10052ASPx.CachedStatePrefix = "cached";
10053ASPxStateItem = ASPx.CreateClass(null, {
10054 constructor: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, kind, disableApplyingStyleToLink){
10055  this.name = name;
10056  this.classNames = classNames;
10057  this.customClassNames = [];
10058  this.resultClassNames = [];
10059  this.cssTexts = cssTexts;
10060  this.postfixes = postfixes;
10061  this.imageObjs = imageObjs;
10062  this.imagePostfixes = imagePostfixes;
10063  this.kind = kind;
10064  this.classNamePostfix = kind.substr(0, 1).toLowerCase();
10065  this.enabled = true;
10066  this.needRefreshBetweenElements = false;
10067  this.elements = null;
10068  this.images = null;
10069  this.links = [];
10070  this.colorChanged = [];
10071  this.textDecorationChanged = [];
10072  this.disableApplyingStyleToLink = !!disableApplyingStyleToLink; 
10073 },
10074 GetCssText: function(index){
10075  if(ASPx.IsExists(this.cssTexts[index]))
10076   return this.cssTexts[index];
10077  return this.cssTexts[0];
10078 },
10079 CreateStyleRule: function(index){
10080  if(this.GetCssText(index) == "") return "";
10081  var styleSheet = ASPx.GetCurrentStyleSheet();
10082  if(styleSheet)
10083   return ASPx.CreateImportantStyleRule(styleSheet, this.GetCssText(index), this.classNamePostfix);  
10084  return ""; 
10085 },
10086 GetClassName: function(index){
10087  if(ASPx.IsExists(this.classNames[index]))
10088   return this.classNames[index];
10089  return this.classNames[0];
10090 },
10091 GetResultClassName: function(index){
10092  if(!ASPx.IsExists(this.resultClassNames[index])) {
10093   if(!ASPx.IsExists(this.customClassNames[index]))
10094    this.customClassNames[index] = this.CreateStyleRule(index);
10095   if(this.GetClassName(index) != "" && this.customClassNames[index] != "")
10096    this.resultClassNames[index] = this.GetClassName(index) + " " + this.customClassNames[index];
10097   else if(this.GetClassName(index) != "")
10098    this.resultClassNames[index] = this.GetClassName(index);
10099   else if(this.customClassNames[index] != "")
10100    this.resultClassNames[index] = this.customClassNames[index];
10101   else
10102    this.resultClassNames[index] = "";
10103  }
10104  return this.resultClassNames[index];
10105 },
10106 GetElements: function(element){
10107  if(!this.elements || !ASPx.IsValidElements(this.elements)){
10108   if(this.postfixes && this.postfixes.length > 0){
10109    this.elements = [ ];
10110    var parentNode = element.parentNode;
10111    if(parentNode){
10112     for(var i = 0; i < this.postfixes.length; i++){
10113      var id = this.name + this.postfixes[i];
10114      this.elements[i] = ASPx.GetChildById(parentNode, id);
10115      if(!this.elements[i])
10116       this.elements[i] = ASPx.GetElementById(id);
10117     }
10118    }
10119   }
10120   else
10121    this.elements = [element];
10122  }
10123  return this.elements;
10124 },
10125 GetImages: function(element){
10126  if(!this.images || !ASPx.IsValidElements(this.images)){
10127   this.images = [ ];
10128   if(this.imagePostfixes && this.imagePostfixes.length > 0){
10129    var elements = this.GetElements(element);
10130    for(var i = 0; i < this.imagePostfixes.length; i++){
10131     var id = this.name + this.imagePostfixes[i];
10132     for(var j = 0; j < elements.length; j++){
10133      if(!elements[j]) continue;
10134      if(elements[j].id == id)
10135       this.images[i] = elements[j];
10136      else
10137       this.images[i] = ASPx.GetChildById(elements[j], id);
10138      if(this.images[i])
10139       break;
10140     }
10141    }
10142   }
10143  }
10144  return this.images;
10145 },
10146 Apply: function(element){
10147  if(!this.enabled) return;
10148  try{
10149   this.ApplyStyle(element);
10150   if(this.imageObjs && this.imageObjs.length > 0)
10151    this.ApplyImage(element);
10152  }
10153  catch(e){
10154  }
10155 },
10156 ApplyStyle: function(element){
10157  var elements = this.GetElements(element);
10158  for(var i = 0; i < elements.length; i++){
10159   if(!elements[i]) continue;
10160   var elementColor, elementTextDecoration;
10161   if(this.colorChanged[i] === undefined) {
10162    elementColor = window.getComputedStyle(elements[i]).color;
10163   }
10164   if(this.textDecorationChanged[i] === undefined) {
10165    elementTextDecoration = window.getComputedStyle(elements[i]).textDecoration;
10166   }
10167   if(this.GetResultClassName(i) != "") {
10168    var className = elements[i].className.replace(this.GetResultClassName(i), "");
10169    elements[i].className = ASPx.Str.Trim(className) + " " + this.GetResultClassName(i);
10170   }
10171   if(this.colorChanged[i] === undefined) {
10172    this.colorChanged[i] = window.getComputedStyle(elements[i]).color !== elementColor;
10173   }
10174   if(this.textDecorationChanged[i] === undefined) {
10175    this.textDecorationChanged[i] = window.getComputedStyle(elements[i]).textDecoration !== elementTextDecoration;
10176   }
10177   if(!ASPx.Browser.Opera || ASPx.Browser.Version >= 9)
10178    this.ApplyStyleToLinks(elements, i);
10179  }
10180 },
10181 ApplyStyleToLinks: function(elements, index){
10182  if(this.disableApplyingStyleToLink)
10183   return;
10184  if(!ASPx.IsValidElements(this.links[index]))
10185   this.links[index] = ASPx.GetNodesByTagName(elements[index], "A");
10186  for(var i = 0; i < this.links[index].length; i++)
10187   this.ApplyStyleToLinkElement(this.links[index][i], index);
10188 },
10189 ApplyStyleToLinkElement: function(link, index) {
10190  if(this.colorChanged[index])
10191   ASPx.Attr.ChangeAttributeExtended(link.style, "color", link, "saved" + this.kind + "Color", "inherit");
10192  if(this.textDecorationChanged[index])
10193   ASPx.Attr.ChangeAttributeExtended(link.style, "text-decoration", link, "saved" + this.kind + "TextDecoration", "inherit");
10194 },
10195 ApplyImage: function(element){
10196  var images = this.GetImages(element);
10197  for(var i = 0; i < images.length; i++){
10198   if(!images[i] || !this.imageObjs[i]) continue;
10199   var useSpriteImage = typeof(this.imageObjs[i]) != "string";
10200   var newUrl = "", newCssClass = "", newBackground = "";
10201   if(useSpriteImage){
10202    newUrl = ASPx.EmptyImageUrl;           
10203    if(this.imageObjs[i].spriteCssClass) 
10204     newCssClass = this.imageObjs[i].spriteCssClass;
10205    if(this.imageObjs[i].spriteBackground)
10206     newBackground = this.imageObjs[i].spriteBackground;
10207   }
10208   else{
10209    newUrl = this.imageObjs[i];
10210    if(ASPx.Attr.IsExistsAttribute(images[i].style, "background"))   
10211     newBackground = " ";
10212   }
10213   if(newUrl != "")
10214    ASPx.Attr.ChangeAttributeExtended(images[i], "src", images[i], "saved" + this.kind + "Src", newUrl);
10215   if(newCssClass != "")
10216    this.ApplyImageClassName(images[i], newCssClass);
10217   if(newBackground != ""){
10218    if(ASPx.Browser.WebKitFamily) {
10219     var savedBackground = ASPx.Attr.GetAttribute(images[i].style, "background");
10220     if(!useSpriteImage)
10221      savedBackground += " " + images[i].style["backgroundPosition"];
10222     ASPx.Attr.SetAttribute(images[i], "saved" + this.kind + "Background", savedBackground);
10223     ASPx.Attr.SetAttribute(images[i].style, "background", newBackground);
10224    }
10225    else
10226     ASPx.Attr.ChangeAttributeExtended(images[i].style, "background", images[i], "saved" + this.kind + "Background", newBackground);
10227   }     
10228  }
10229 },
10230 ApplyImageClassName: function(element, newClassName){
10231  if(ASPx.Attr.GetAttribute(element, "saved" + this.kind + "ClassName"))
10232   this.CancelImageClassName(element);
10233  var className = element.className;
10234  ASPx.Attr.SetAttribute(element, "saved" + this.kind + "ClassName", className);
10235  element.className = className + " " + newClassName;
10236 },
10237 Cancel: function(element){
10238  if(!this.enabled) return;
10239  try{  
10240   if(this.imageObjs && this.imageObjs.length > 0)
10241    this.CancelImage(element);
10242   this.CancelStyle(element);
10243  }
10244  catch(e){
10245  }
10246 },
10247 CancelStyle: function(element){
10248  var elements = this.GetElements(element);
10249  for(var i = 0; i < elements.length; i++){
10250   if(!elements[i]) continue;
10251   if(this.GetResultClassName(i) != "") {
10252    var className = ASPx.Str.Trim(elements[i].className.replace(this.GetResultClassName(i), ""));
10253    elements[i].className = className;
10254   }
10255   if(!ASPx.Browser.Opera || ASPx.Browser.Version >= 9)
10256    this.CancelStyleFromLinks(elements, i);
10257  }
10258 },
10259 CancelStyleFromLinks: function(elements, index){
10260  if(this.disableApplyingStyleToLink)
10261   return;
10262  if(!ASPx.IsValidElements(this.links[index]))
10263   this.links[index] = ASPx.GetNodesByTagName(elements[index], "A");
10264  for(var i = 0; i < this.links[index].length; i++)
10265   this.CancelStyleFromLinkElement(this.links[index][i], index);
10266 },
10267 CancelStyleFromLinkElement: function(link, index){
10268  ASPx.Attr.RestoreAttributeExtended(link.style, "color", link, "saved" + this.kind + "Color");
10269  ASPx.Attr.RestoreAttributeExtended(link.style, "text-decoration", link, "saved" + this.kind + "TextDecoration");
10270 },
10271 CancelImage: function(element){
10272  var images = this.GetImages(element);
10273  for(var i = 0; i < images.length; i++){
10274   if(!images[i] || !this.imageObjs[i]) continue;
10275   ASPx.Attr.RestoreAttributeExtended(images[i], "src", images[i], "saved" + this.kind + "Src");
10276   this.CancelImageClassName(images[i]);
10277   ASPx.Attr.RestoreAttributeExtended(images[i].style, "background", images[i], "saved" + this.kind + "Background");
10278  }
10279 },
10280 CancelImageClassName: function(element){
10281  var savedClassName = ASPx.Attr.GetAttribute(element, "saved" + this.kind + "ClassName");
10282  if(ASPx.IsExists(savedClassName)) {
10283   element.className = savedClassName;
10284   ASPx.Attr.RemoveAttribute(element, "saved" + this.kind + "ClassName");
10285  }
10286 },
10287 Clone: function(){
10288  return new ASPxStateItem(this.name, this.classNames, this.cssTexts, this.postfixes, 
10289   this.imageObjs, this.imagePostfixes, this.kind, this.disableApplyingStyleToLink);
10290 },
10291 IsChildElement: function(element){
10292  if(element != null){
10293   var elements = this.GetElements(element);
10294   for(var i = 0; i < elements.length; i++){
10295    if(!elements[i]) continue;
10296    if(ASPx.GetIsParent(elements[i], element)) 
10297     return true;
10298   }
10299  }
10300  return false;
10301 },
10302 ForceRedrawAppearance: function(element) {
10303  if(!aspxGetStateController().IsForceRedrawAppearanceLocked()) {
10304   var value = element.style.opacity;
10305   element.style.opacity = "0.7777";
10306   var dummy = element.offsetWidth;
10307   element.style.opacity = value;
10308  }
10309 }
10310});
10311ASPxClientStateEventArgs = ASPx.CreateClass(null, {
10312 constructor: function(item, element){
10313  this.item = item;
10314  this.element = element;
10315  this.toElement = null;
10316  this.fromElement = null;
10317  this.htmlEvent = null;
10318 }
10319});
10320ASPxStateController = ASPx.CreateClass(null, {
10321 constructor: function(){
10322  this.focusedItems = { };
10323  this.hoverItems = { };
10324  this.pressedItems = { };
10325  this.selectedItems = { };
10326  this.disabledItems = {};
10327  this.readOnlyItems = {};
10328  this.disabledScheme = {};
10329  this.currentFocusedElement = null;
10330  this.currentFocusedItemName = null;
10331  this.currentHoverElement = null;
10332  this.currentHoverItemName = null;
10333  this.currentPressedElement = null;
10334  this.currentPressedItemName = null;
10335  this.savedCurrentPressedElement = null;
10336  this.savedCurrentMouseMoveSrcElement = null;
10337  this.forceRedrawAppearanceLockCount = 0;
10338  this.stateItemType = ASPxStateItem;
10339  this.AfterSetFocusedState = new ASPxClientEvent();
10340  this.AfterClearFocusedState = new ASPxClientEvent();
10341  this.AfterSetHoverState = new ASPxClientEvent();
10342  this.AfterClearHoverState = new ASPxClientEvent();
10343  this.AfterSetPressedState = new ASPxClientEvent();
10344  this.AfterClearPressedState = new ASPxClientEvent();
10345  this.AfterDisabled = new ASPxClientEvent();
10346  this.AfterEnabled = new ASPxClientEvent();
10347  this.BeforeSetFocusedState = new ASPxClientEvent();
10348  this.BeforeClearFocusedState = new ASPxClientEvent();
10349  this.BeforeSetHoverState = new ASPxClientEvent();
10350  this.BeforeClearHoverState = new ASPxClientEvent();
10351  this.BeforeSetPressedState = new ASPxClientEvent();
10352  this.BeforeClearPressedState = new ASPxClientEvent();
10353  this.BeforeDisabled = new ASPxClientEvent();
10354  this.BeforeEnabled = new ASPxClientEvent();
10355  this.FocusedItemKeyDown = new ASPxClientEvent();
10356 }, 
10357 AddHoverItem: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink){
10358  this.AddItem(this.hoverItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.HoverItemKind, disableApplyingStyleToLink);
10359  this.AddItem(this.focusedItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.FocusedItemKind, disableApplyingStyleToLink);
10360 },
10361 AddPressedItem: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink){
10362  this.AddItem(this.pressedItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.PressedItemKind, disableApplyingStyleToLink);
10363 },
10364 AddSelectedItem: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink){
10365  this.AddItem(this.selectedItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.SelectedItemKind, disableApplyingStyleToLink);
10366 },
10367 AddDisabledItem: function (name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink, rootId) {
10368  this.AddItem(this.disabledItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes,
10369   ASPx.DisabledItemKind, disableApplyingStyleToLink, this.addIdToDisabledItemScheme, rootId);
10370 },
10371 AddReadOnlyItem: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink) {
10372  this.AddItem(this.readOnlyItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.ReadOnlyItemKind, disableApplyingStyleToLink);
10373 },
10374 addIdToDisabledItemScheme: function(rootId, childId) {
10375  if (!rootId)
10376   return;
10377  if (!this.disabledScheme[rootId])
10378   this.disabledScheme[rootId] = [rootId];
10379  if (childId && (rootId != childId) && ASPx.Data.ArrayIndexOf(this.disabledScheme[rootId], childId) == -1)
10380   this.disabledScheme[rootId].push(childId);
10381 },
10382 removeIdFromDisabledItemScheme: function(rootId, childId) {
10383  if (!rootId || !this.disabledScheme[rootId])
10384   return;
10385  ASPx.Data.ArrayRemove(this.disabledScheme[rootId], childId);
10386  if (this.disabledScheme[rootId].length == 0)
10387   delete this.disabledScheme[rootId];
10388 },
10389 AddItem: function (items, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, kind, disableApplyingStyleToLink, onAdd, rootId) {
10390  var type = this.getStateItemType();
10391  var stateItem = new type(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, kind, disableApplyingStyleToLink);
10392  if (postfixes && postfixes.length > 0) {
10393   for (var i = 0; i < postfixes.length; i++) {
10394    items[name + postfixes[i]] = stateItem;
10395    if (onAdd)
10396     onAdd.call(this, rootId, name + postfixes[i]);
10397   }
10398  }
10399  else {
10400   if (onAdd)
10401    onAdd.call(this, rootId, name);
10402   items[name] = stateItem;
10403  }
10404  ASPx.StateItemsExist = true;
10405 },
10406 getStateItemType: function () { return this.stateItemType; },
10407 withCustomStateItemType: function (newType, callback) {
10408  this.stateItemType = newType;
10409  callback(this);
10410  this.stateItemType = ASPxStateItem;
10411 },
10412 RemoveHoverItem: function(name, postfixes){
10413  this.RemoveItem(this.hoverItems, name, postfixes);
10414  this.RemoveItem(this.focusedItems, name, postfixes);
10415 },
10416 RemovePressedItem: function(name, postfixes){
10417  this.RemoveItem(this.pressedItems, name, postfixes);
10418 },
10419 RemoveSelectedItem: function(name, postfixes){
10420  this.RemoveItem(this.selectedItems, name, postfixes);
10421 },
10422 RemoveDisabledItem: function (name, postfixes, rootId) {
10423  this.RemoveItem(this.disabledItems, name, postfixes, this.removeIdFromDisabledItemScheme, rootId);
10424 },
10425 RemoveReadOnlyItem: function(name, postfixes) {
10426  this.RemoveItem(this.readOnlyItems, name, postfixes);
10427 },
10428 RemoveItem: function (items, name, postfixes, onRemove, rootId) {
10429  if (postfixes && postfixes.length > 0) {
10430   for (var i = 0; i < postfixes.length; i++) {
10431    delete items[name + postfixes[i]];
10432    if (onRemove)
10433     onRemove.call(this, rootId, name + postfixes[i]);
10434   }
10435  }
10436  else {
10437   delete items[name];
10438   if (onRemove)
10439    onRemove.call(this, rootId, name);
10440  }
10441 },
10442 RemoveDisposedItems: function(){
10443  this.RemoveDisposedItemsByType(this.hoverItems);
10444  this.RemoveDisposedItemsByType(this.pressedItems);
10445  this.RemoveDisposedItemsByType(this.focusedItems);
10446  this.RemoveDisposedItemsByType(this.selectedItems);
10447  this.RemoveDisposedItemsByType(this.disabledItems);
10448  this.RemoveDisposedItemsByType(this.disabledScheme);
10449  this.RemoveDisposedItemsByType(this.readOnlyItems);
10450 },
10451 RemoveDisposedItemsByType: function(items){
10452  for(var key in items) {
10453   if(items.hasOwnProperty(key)) {
10454    var item = items[key];
10455    var element = document.getElementById(key);
10456    if(!element || !ASPx.IsValidElement(element))
10457     delete items[key];
10458    try {
10459     if(item && item.elements) {
10460      for(var i = 0; i < item.elements.length; i++) {
10461       if(!ASPx.IsValidElements(item.links[i]))
10462        item.links[i] = null;
10463      }
10464     }
10465    }
10466    catch(e) {
10467    }
10468   }
10469  }
10470 },
10471 GetFocusedElement: function(srcElement){
10472  return this.GetItemElement(srcElement, this.focusedItems, ASPx.FocusedItemKind);
10473 },
10474 GetHoverElement: function(srcElement){
10475  return this.GetItemElement(srcElement, this.hoverItems, ASPx.HoverItemKind);
10476 },
10477 GetPressedElement: function(srcElement){
10478  return this.GetItemElement(srcElement, this.pressedItems, ASPx.PressedItemKind);
10479 },
10480 GetSelectedElement: function(srcElement){
10481  return this.GetItemElement(srcElement, this.selectedItems, ASPx.SelectedItemKind);
10482 },
10483 GetDisabledElement: function(srcElement){
10484  return this.GetItemElement(srcElement, this.disabledItems, ASPx.DisabledItemKind);
10485 },
10486 GetReadOnlyElement: function(srcElement) {
10487  return this.GetItemElement(srcElement, this.readOnlyItems, ASPx.ReadOnlyItemKind);
10488 },
10489 GetItemElement: function(srcElement, items, kind){
10490  if(srcElement && srcElement[ASPx.CachedStatePrefix + kind]){
10491   var cachedElement = srcElement[ASPx.CachedStatePrefix + kind];
10492   if(cachedElement != ASPx.EmptyObject)
10493    return cachedElement;
10494   return null;
10495  }
10496  var element = srcElement;
10497  while(element != null) {
10498   var item = items[element.id];
10499   if(item){
10500    this.CacheItemElement(srcElement, kind, element);
10501    element[kind] = item;
10502    return element;
10503   }
10504   element = element.parentNode;
10505  }
10506  this.CacheItemElement(srcElement, kind, ASPx.EmptyObject);
10507  return null;
10508 },
10509 CacheItemElement: function(srcElement, kind, value){
10510  if(srcElement && !srcElement[ASPx.CachedStatePrefix + kind])
10511   srcElement[ASPx.CachedStatePrefix + kind] = value;
10512 },
10513 DoSetFocusedState: function(element, fromElement){
10514  var item = element[ASPx.FocusedItemKind];
10515  if(item){
10516   var args = new ASPxClientStateEventArgs(item, element);
10517   args.fromElement = fromElement;
10518   this.BeforeSetFocusedState.FireEvent(this, args);
10519   item.Apply(element);
10520   this.AfterSetFocusedState.FireEvent(this, args);
10521  }
10522 },
10523 DoClearFocusedState: function(element, toElement){
10524  var item = element[ASPx.FocusedItemKind];
10525  if(item){
10526   var args = new ASPxClientStateEventArgs(item, element);
10527   args.toElement = toElement;
10528   this.BeforeClearFocusedState.FireEvent(this, args);
10529   item.Cancel(element);
10530   this.AfterClearFocusedState.FireEvent(this, args);
10531  }
10532 },
10533 DoSetHoverState: function(element, fromElement){
10534  var item = element[ASPx.HoverItemKind];
10535  if(item){
10536   var args = new ASPxClientStateEventArgs(item, element);
10537   args.fromElement = fromElement;
10538   this.BeforeSetHoverState.FireEvent(this, args);
10539   item.Apply(element);
10540   this.AfterSetHoverState.FireEvent(this, args);
10541  }
10542 },
10543 DoClearHoverState: function(element, toElement){
10544  var item = element[ASPx.HoverItemKind];
10545  if(item){
10546   var args = new ASPxClientStateEventArgs(item, element);
10547   args.toElement = toElement;
10548   this.BeforeClearHoverState.FireEvent(this, args);
10549   item.Cancel(element);
10550   this.AfterClearHoverState.FireEvent(this, args);
10551  }
10552 },
10553 DoSetPressedState: function(element){
10554  var item = element[ASPx.PressedItemKind];
10555  if(item){
10556   var args = new ASPxClientStateEventArgs(item, element);
10557   this.BeforeSetPressedState.FireEvent(this, args);
10558   item.Apply(element);
10559   this.AfterSetPressedState.FireEvent(this, args);
10560  }
10561 },
10562 DoClearPressedState: function(element){
10563  var item = element[ASPx.PressedItemKind];
10564  if(item){
10565   var args = new ASPxClientStateEventArgs(item, element);
10566   this.BeforeClearPressedState.FireEvent(this, args);
10567   item.Cancel(element);
10568   this.AfterClearPressedState.FireEvent(this, args);
10569  }
10570 },
10571 SetCurrentFocusedElement: function(element){
10572  if(this.currentFocusedElement && !ASPx.IsValidElement(this.currentFocusedElement)){
10573   this.currentFocusedElement = null;
10574   this.currentFocusedItemName = "";
10575  }
10576  if(this.currentFocusedElement != element){
10577   var oldCurrentFocusedElement = this.currentFocusedElement;
10578   var item = (element != null) ? element[ASPx.FocusedItemKind] : null;
10579   var itemName = (item != null) ? item.name : "";
10580   if(this.currentFocusedItemName != itemName){
10581    if(this.currentHoverItemName != "")
10582     this.SetCurrentHoverElement(null);
10583    if(this.currentFocusedElement != null)
10584     this.DoClearFocusedState(this.currentFocusedElement, element);
10585    this.currentFocusedElement = element;
10586    item = (element != null) ? element[ASPx.FocusedItemKind] : null;
10587    this.currentFocusedItemName = (item != null) ? item.name : "";
10588    if(this.currentFocusedElement != null)
10589     this.DoSetFocusedState(this.currentFocusedElement, oldCurrentFocusedElement);
10590   }
10591  }
10592 },
10593 GetCurrentHoverElement: function() {
10594  return this.currentHoverElement;
10595 },
10596 SetCurrentHoverElement: function(element){
10597  if(this.currentHoverElement && !ASPx.IsValidElement(this.currentHoverElement)){
10598   this.currentHoverElement = null;
10599   this.currentHoverItemName = "";
10600  }
10601  var item = (element != null) ? element[ASPx.HoverItemKind] : null;
10602  if(item && !item.enabled) { 
10603   element = this.GetItemElement(element.parentNode, this.hoverItems, ASPx.HoverItemKind);
10604   item = (element != null) ? element[ASPx.HoverItemKind] : null;
10605  }
10606  if(this.currentHoverElement != element){
10607   var oldCurrentHoverElement = this.currentHoverElement,
10608    itemName = (item != null) ? item.name : "";
10609   if(this.currentHoverItemName != itemName || (item != null && item.needRefreshBetweenElements)){
10610    if(this.currentHoverElement != null)
10611     this.DoClearHoverState(this.currentHoverElement, element);
10612    item = (element != null) ? element[ASPx.HoverItemKind] : null;
10613    if(item == null || item.enabled){
10614     this.currentHoverElement = element;
10615     this.currentHoverItemName = (item != null) ? item.name : "";
10616     if(this.currentHoverElement != null)
10617      this.DoSetHoverState(this.currentHoverElement, oldCurrentHoverElement);
10618    }
10619   }
10620  }
10621 },
10622 SetCurrentPressedElement: function(element){
10623  if(this.currentPressedElement && !ASPx.IsValidElement(this.currentPressedElement)){
10624   this.currentPressedElement = null;
10625   this.currentPressedItemName = "";
10626  }
10627  if(this.currentPressedElement != element){
10628   if(this.currentPressedElement != null)
10629    this.DoClearPressedState(this.currentPressedElement);
10630   var item = (element != null) ? element[ASPx.PressedItemKind] : null;
10631   if(item == null || item.enabled){
10632    this.currentPressedElement = element;
10633    this.currentPressedItemName = (item != null) ? item.name : "";
10634    if(this.currentPressedElement != null)
10635     this.DoSetPressedState(this.currentPressedElement);
10636   }
10637  }
10638 },
10639 SetCurrentFocusedElementBySrcElement: function(srcElement){
10640  var element = this.GetFocusedElement(srcElement);
10641  this.SetCurrentFocusedElement(element);
10642 },
10643 SetCurrentHoverElementBySrcElement: function(srcElement){
10644  var element = this.GetHoverElement(srcElement);
10645  this.SetCurrentHoverElement(element);
10646 },
10647 SetCurrentPressedElementBySrcElement: function(srcElement){
10648  var element = this.GetPressedElement(srcElement);
10649  this.SetCurrentPressedElement(element);
10650 },
10651 SetPressedElement: function (element) {
10652  this.SetCurrentHoverElement(null);
10653  this.SetCurrentPressedElementBySrcElement(element);
10654  this.savedCurrentPressedElement = this.currentPressedElement;
10655 },
10656 SelectElement: function (element) {
10657  var item = element[ASPx.SelectedItemKind];
10658  if(item)
10659   item.Apply(element);
10660 }, 
10661 SelectElementBySrcElement: function(srcElement){
10662  var element = this.GetSelectedElement(srcElement);
10663  if(element != null) this.SelectElement(element);
10664 }, 
10665 DeselectElement: function(element){
10666  var item = element[ASPx.SelectedItemKind];
10667  if(item)
10668   item.Cancel(element);
10669 }, 
10670 DeselectElementBySrcElement: function(srcElement){
10671  var element = this.GetSelectedElement(srcElement);
10672  if(element != null) this.DeselectElement(element);
10673 },
10674 SetElementEnabled: function(element, enable){
10675  if(enable)
10676   this.EnableElement(element);
10677  else
10678   this.DisableElement(element);
10679 },
10680 SetElementReadOnly: function(element, readOnly) {
10681  var element = this.GetReadOnlyElement(element);
10682  if (element != null) {
10683   var item = element[ASPx.ReadOnlyItemKind];
10684   if(item) {
10685    if(readOnly) {
10686     if(item.name == this.currentPressedItemName)
10687      this.SetCurrentPressedElement(null);
10688     if(item.name == this.currentHoverItemName)
10689      this.SetCurrentHoverElement(null);
10690    }
10691    if(readOnly)
10692     item.Apply(element);
10693    else
10694     item.Cancel(element);
10695   }
10696  }
10697 },
10698 SetElementWithChildNodesEnabled: function (parentName, enabled) {
10699  var procFunct = (enabled ? this.EnableElement : this.DisableElement);
10700  var childItems = this.disabledScheme[parentName];
10701  if (childItems && childItems.length > 0)
10702   for (var i = 0; i < childItems.length; i++) {
10703    procFunct.call(this, document.getElementById(childItems[i]));
10704   }
10705 },
10706 DisableElement: function (element) {
10707  var element = this.GetDisabledElement(element);
10708  if(element != null) {
10709   var item = element[ASPx.DisabledItemKind];
10710   if(item){
10711    var args = new ASPxClientStateEventArgs(item, element);
10712    this.BeforeDisabled.FireEvent(this, args);
10713    if(item.name == this.currentPressedItemName)
10714     this.SetCurrentPressedElement(null);
10715    if(item.name == this.currentHoverItemName)
10716     this.SetCurrentHoverElement(null);
10717    item.Apply(element);
10718    this.SetMouseStateItemsEnabled(item.name, item.postfixes, false);
10719    this.AfterDisabled.FireEvent(this, args);
10720   }
10721  }
10722 }, 
10723 EnableElement: function(element){
10724  var element = this.GetDisabledElement(element);
10725  if(element != null) {
10726   var item = element[ASPx.DisabledItemKind];
10727   if(item){
10728    var args = new ASPxClientStateEventArgs(item, element);
10729    this.BeforeEnabled.FireEvent(this, args);
10730    item.Cancel(element);
10731    this.SetMouseStateItemsEnabled(item.name, item.postfixes, true);
10732    this.AfterEnabled.FireEvent(this, args);
10733   }
10734  }
10735 }, 
10736 SetMouseStateItemsEnabled: function(name, postfixes, enabled){   
10737  if(postfixes && postfixes.length > 0){
10738   for(var i = 0; i < postfixes.length; i ++){
10739    this.SetItemsEnabled(this.hoverItems, name + postfixes[i], enabled);
10740    this.SetItemsEnabled(this.pressedItems, name + postfixes[i], enabled);
10741    this.SetItemsEnabled(this.focusedItems, name + postfixes[i], enabled);
10742   }
10743  }
10744  else{
10745   this.SetItemsEnabled(this.hoverItems, name, enabled);
10746   this.SetItemsEnabled(this.pressedItems, name, enabled);
10747   this.SetItemsEnabled(this.focusedItems, name, enabled);
10748  }  
10749 },
10750 SetItemsEnabled: function(items, name, enabled){   
10751  if(items[name])
10752   items[name].enabled = enabled;
10753 },
10754 OnFocusMove: function(evt){
10755  var element = ASPx.Evt.GetEventSource(evt);
10756  aspxGetStateController().SetCurrentFocusedElementBySrcElement(element);
10757 },
10758 OnMouseMove: function(evt, checkElementChanged){
10759  var srcElement = ASPx.Evt.GetEventSource(evt);
10760  if(checkElementChanged && srcElement == this.savedCurrentMouseMoveSrcElement) return;
10761  this.savedCurrentMouseMoveSrcElement = srcElement;
10762  if(this.savedCurrentPressedElement == null)
10763   this.SetCurrentHoverElementBySrcElement(srcElement);
10764  else{
10765   var element = this.GetPressedElement(srcElement);
10766   if(element != this.currentPressedElement){
10767    if(element == this.savedCurrentPressedElement)
10768     this.SetCurrentPressedElement(this.savedCurrentPressedElement);
10769    else
10770     this.SetCurrentPressedElement(null);
10771   }
10772  }
10773 },
10774 OnMouseDown: function(evt){
10775  if(!ASPx.Evt.IsLeftButtonPressed(evt)) return;
10776  var srcElement = ASPx.Evt.GetEventSource(evt);
10777  this.OnMouseDownOnElement(srcElement);
10778 },
10779 OnMouseDownOnElement: function (element) {
10780  if(this.GetPressedElement(element) == null) return;
10781  this.SetPressedElement(element);
10782 },
10783 OnMouseUp: function(evt){
10784  var srcElement = ASPx.Evt.GetEventSource(evt);
10785  this.OnMouseUpOnElement(srcElement);
10786 },
10787 OnMouseUpOnElement: function(element){
10788  if(this.savedCurrentPressedElement == null) return;
10789  this.ClearSavedCurrentPressedElement();
10790  this.SetCurrentHoverElementBySrcElement(element);
10791 },
10792 OnMouseOver: function(evt){
10793  var element = ASPx.Evt.GetEventSource(evt);
10794  if(element && element.tagName == "IFRAME")
10795   this.OnMouseMove(evt, true);
10796 },
10797 OnKeyDown: function(evt){
10798  var element = this.GetFocusedElement(ASPx.Evt.GetEventSource(evt));
10799  if(element != null && element == this.currentFocusedElement) {
10800   var item = element[ASPx.FocusedItemKind];
10801   if(item){
10802    var args = new ASPxClientStateEventArgs(item, element);
10803    args.htmlEvent = evt;
10804    this.FocusedItemKeyDown.FireEvent(this, args);
10805   }
10806  }
10807 },
10808 OnKeyUpOnElement: function(evt) {
10809  if(this.savedCurrentPressedElement != null && ASPx.Evt.IsActionKeyPressed(evt))
10810   this.ClearSavedCurrentPressedElement();
10811 },
10812 OnSelectStart: function(evt){
10813  if(this.savedCurrentPressedElement) {
10814   ASPx.Selection.Clear();
10815   return false;
10816  }
10817 },
10818 ClearSavedCurrentPressedElement: function() {
10819  this.savedCurrentPressedElement = null;
10820  this.SetCurrentPressedElement(null);
10821 },
10822 ClearCache: function(srcElement, kind) {
10823  if(srcElement[ASPx.CachedStatePrefix + kind])
10824   srcElement[ASPx.CachedStatePrefix + kind] = null;
10825 },
10826 ClearElementCache: function(srcElement) {
10827  this.ClearCache(srcElement, ASPx.FocusedItemKind);
10828  this.ClearCache(srcElement, ASPx.HoverItemKind);
10829  this.ClearCache(srcElement, ASPx.PressedItemKind);
10830  this.ClearCache(srcElement, ASPx.SelectedItemKind);
10831  this.ClearCache(srcElement, ASPx.DisabledItemKind);
10832 },
10833 ClearElementCacheInContainer: function(container) {
10834  var elements = ASPx.GetNodes(container);
10835  elements.push(container);
10836  ASPx.Data.ForEach(elements, this.ClearElementCache.bind(this));
10837 },
10838 LockForceRedrawAppearance: function() {
10839  this.forceRedrawAppearanceLockCount++;
10840 },
10841 UnlockForceRedrawAppearance: function() {
10842  this.forceRedrawAppearanceLockCount--;
10843 },
10844 IsForceRedrawAppearanceLocked: function() {
10845  return this.forceRedrawAppearanceLockCount > 0;
10846 },
10847 GetHoverItem: function(srcElement) {
10848  var element = this.GetHoverElement(srcElement);
10849  return (element != null) ? element[ASPx.HoverItemKind] : null;
10850 }
10851});
10852var stateController = null;
10853function aspxGetStateController(){
10854 if(stateController == null)
10855  stateController = new ASPxStateController();
10856 return stateController;
10857}
10858function aspxAddStateItems(method, namePrefix, classes, disableApplyingStyleToLink){
10859 for(var i = 0; i < classes.length; i ++){
10860  for(var j = 0; j < classes[i][2].length; j ++) {
10861   var name = namePrefix;
10862   if(classes[i][2][j])
10863    name += "_" + classes[i][2][j];
10864   var postfixes = classes[i][3] || null;
10865   var imageObjs = (classes[i][4] && classes[i][4][j]) || null;
10866   var imagePostfixes = classes[i][5] || null;
10867   method.call(aspxGetStateController(), name, classes[i][0], classes[i][1], postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink, namePrefix);
10868  }
10869 }
10870}
10871ASPx.AddHoverItems = function(namePrefix, classes, disableApplyingStyleToLink){
10872 aspxAddStateItems(aspxGetStateController().AddHoverItem, namePrefix, classes, disableApplyingStyleToLink);
10873};
10874ASPx.AddPressedItems = function(namePrefix, classes, disableApplyingStyleToLink){
10875 aspxAddStateItems(aspxGetStateController().AddPressedItem, namePrefix, classes, disableApplyingStyleToLink);
10876};
10877ASPx.AddSelectedItems = function(namePrefix, classes, disableApplyingStyleToLink){
10878 aspxAddStateItems(aspxGetStateController().AddSelectedItem, namePrefix, classes, disableApplyingStyleToLink);
10879};
10880ASPx.AddDisabledItems = function(namePrefix, classes, disableApplyingStyleToLink){
10881 aspxAddStateItems(aspxGetStateController().AddDisabledItem, namePrefix, classes, disableApplyingStyleToLink);
10882};
10883ASPx.AddReadOnlyItems = function(namePrefix, classes, disableApplyingStyleToLink) {
10884 aspxAddStateItems(aspxGetStateController().AddReadOnlyItem, namePrefix, classes, disableApplyingStyleToLink);
10885};
10886function aspxRemoveStateItems(method, namePrefix, classes){
10887 for(var i = 0; i < classes.length; i ++){
10888  for(var j = 0; j < classes[i][0].length; j ++) {
10889   var name = namePrefix;
10890   if(classes[i][0][j])
10891    name += "_" + classes[i][0][j];
10892   method.call(aspxGetStateController(), name, classes[i][1], namePrefix);
10893  }
10894 }
10895}
10896ASPx.RemoveHoverItems = function(namePrefix, classes){
10897 aspxRemoveStateItems(aspxGetStateController().RemoveHoverItem, namePrefix, classes);
10898};
10899ASPx.RemovePressedItems = function(namePrefix, classes){
10900 aspxRemoveStateItems(aspxGetStateController().RemovePressedItem, namePrefix, classes);
10901};
10902ASPx.RemoveSelectedItems = function(namePrefix, classes){
10903 aspxRemoveStateItems(aspxGetStateController().RemoveSelectedItem, namePrefix, classes);
10904};
10905ASPx.RemoveDisabledItems = function(namePrefix, classes){
10906 aspxRemoveStateItems(aspxGetStateController().RemoveDisabledItem, namePrefix, classes);
10907};
10908ASPx.RemoveReadOnlyItems = function(namePrefix, classes) {
10909 aspxRemoveStateItems(aspxGetStateController().RemoveReadOnlyItem, namePrefix, classes);
10910};
10911ASPx.AddAfterClearFocusedState = function(handler){
10912 aspxGetStateController().AfterClearFocusedState.AddHandler(handler);
10913};
10914ASPx.AddAfterSetFocusedState = function(handler){
10915 aspxGetStateController().AfterSetFocusedState.AddHandler(handler);
10916};
10917ASPx.AddAfterClearHoverState = function(handler){
10918 aspxGetStateController().AfterClearHoverState.AddHandler(handler);
10919};
10920ASPx.AddAfterSetHoverState = function(handler){
10921 aspxGetStateController().AfterSetHoverState.AddHandler(handler);
10922};
10923ASPx.AddAfterClearPressedState = function(handler){
10924 aspxGetStateController().AfterClearPressedState.AddHandler(handler);
10925};
10926ASPx.AddAfterSetPressedState = function(handler){
10927 aspxGetStateController().AfterSetPressedState.AddHandler(handler);
10928};
10929ASPx.AddAfterDisabled = function(handler){
10930 aspxGetStateController().AfterDisabled.AddHandler(handler);
10931};
10932ASPx.AddAfterEnabled = function(handler){
10933 aspxGetStateController().AfterEnabled.AddHandler(handler);
10934};
10935ASPx.AddBeforeClearFocusedState = function(handler){
10936 aspxGetStateController().BeforeClearFocusedState.AddHandler(handler);
10937};
10938ASPx.AddBeforeSetFocusedState = function(handler){
10939 aspxGetStateController().BeforeSetFocusedState.AddHandler(handler);
10940};
10941ASPx.AddBeforeClearHoverState = function(handler){
10942 aspxGetStateController().BeforeClearHoverState.AddHandler(handler);
10943};
10944ASPx.AddBeforeSetHoverState = function(handler){
10945 aspxGetStateController().BeforeSetHoverState.AddHandler(handler);
10946};
10947ASPx.AddBeforeClearPressedState = function(handler){
10948 aspxGetStateController().BeforeClearPressedState.AddHandler(handler);
10949};
10950ASPx.AddBeforeSetPressedState = function(handler){
10951 aspxGetStateController().BeforeSetPressedState.AddHandler(handler);
10952};
10953ASPx.AddBeforeDisabled = function(handler){
10954 aspxGetStateController().BeforeDisabled.AddHandler(handler);
10955};
10956ASPx.AddBeforeEnabled = function(handler){
10957 aspxGetStateController().BeforeEnabled.AddHandler(handler);
10958};
10959ASPx.AddFocusedItemKeyDown = function(handler){
10960 aspxGetStateController().FocusedItemKeyDown.AddHandler(handler);
10961};
10962ASPx.SetHoverState = function(element){
10963 aspxGetStateController().SetCurrentHoverElementBySrcElement(element);
10964};
10965ASPx.ClearHoverState = function(evt){
10966 aspxGetStateController().SetCurrentHoverElementBySrcElement(null);
10967};
10968ASPx.UpdateHoverState = function(evt){
10969 aspxGetStateController().OnMouseMove(evt, false);
10970};
10971ASPx.SetFocusedState = function(element){
10972 aspxGetStateController().SetCurrentFocusedElementBySrcElement(element);
10973};
10974ASPx.ClearFocusedState = function(evt){
10975 aspxGetStateController().SetCurrentFocusedElementBySrcElement(null);
10976};
10977ASPx.UpdateFocusedState = function(evt){
10978 aspxGetStateController().OnFocusMove(evt);
10979};
10980ASPx.AccessibilityMarkerClass = "dxalink";
10981ASPx.AssignAccessibilityEventsToChildrenLinks = function(container, clearFocusedStateOnMouseOut){
10982 var links = ASPx.GetNodesByPartialClassName(container, ASPx.AccessibilityMarkerClass);
10983 for(var i = 0; i < links.length; i++)
10984  ASPx.AssignAccessibilityEventsToLink(links[i], clearFocusedStateOnMouseOut);
10985};
10986ASPx.AssignAccessibilityEventsToLink = function(link, clearFocusedStateOnMouseOut) {
10987 if(!ASPx.ElementContainsCssClass(link, ASPx.AccessibilityMarkerClass))
10988  return;
10989 ASPx.AssignAccessibilityEventsToLinkCore(link, clearFocusedStateOnMouseOut);
10990};
10991ASPx.AssignAccessibilityEventsToLinkCore = function (link, clearFocusedStateOnMouseOut) {
10992 ASPx.Evt.AttachEventToElement(link, "focus", function (e) { ASPx.UpdateFocusedState(e); });
10993 var clearFocusedStateHandler = function (e) { ASPx.ClearFocusedState(e); };
10994 ASPx.Evt.AttachEventToElement(link, "blur", clearFocusedStateHandler);
10995 if(clearFocusedStateOnMouseOut)
10996  ASPx.Evt.AttachEventToElement(link, "mouseout", clearFocusedStateHandler);
10997};
10998ASPx.Evt.AttachEventToDocument("mousemove", function(evt) {
10999 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
11000  aspxGetStateController().OnMouseMove(evt, true);
11001});
11002ASPx.Evt.AttachEventToDocument(ASPx.TouchUIHelper.touchMouseDownEventName, function(evt) {
11003 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
11004  aspxGetStateController().OnMouseDown(evt);
11005});
11006ASPx.Evt.AttachEventToDocument(ASPx.TouchUIHelper.touchMouseUpEventName, function(evt) {
11007 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
11008  aspxGetStateController().OnMouseUp(evt);
11009});
11010ASPx.Evt.AttachEventToDocument("mouseover", function(evt) {
11011 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
11012  aspxGetStateController().OnMouseOver(evt);
11013});
11014ASPx.Evt.AttachEventToDocument("keydown", function(evt) {
11015 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
11016  aspxGetStateController().OnKeyDown(evt);
11017});
11018ASPx.Evt.AttachEventToDocument("selectstart", function(evt) {
11019 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
11020  return aspxGetStateController().OnSelectStart(evt);
11021});
11022ASPx.GetStateController = aspxGetStateController;
11023ASPx.StateItem = ASPxStateItem;
11024})();
11025
11026(function () {
11027 var ASPx = window.ASPx || {};
11028 ASPx.ASPxImageLoad = {};
11029 ASPx.ASPxImageLoad.dxDefaultLoadingImageCssClass = "dxe-loadingImage";
11030 ASPx.ASPxImageLoad.dxDefaultLoadingImageCssClassRegexp = new RegExp("dx\\w+-loadingImage");
11031 ASPx.ASPxImageLoad.OnLoad = function (image, customLoadingImage, isOldIE, customBackgroundImageUrl) {
11032  image.dxCustomBackgroundImageUrl = "";
11033  image.dxShowLoadingImage = true;
11034  image.dxCustomLoadingImage = customLoadingImage;
11035  if (customBackgroundImageUrl != "")
11036   image.dxCustomBackgroundImageUrl = "url('" + customBackgroundImageUrl + "')";
11037  ASPx.ASPxImageLoad.prepareImageBackground(image, isOldIE);
11038  ASPx.ASPxImageLoad.removeHandlers(image);
11039  image.className = image.className.replace(ASPx.ASPxImageLoad.dxDefaultLoadingImageCssClassRegexp, "");
11040 };
11041 ASPx.ASPxImageLoad.removeASPxImageBackground = function (image, isOldIE) {
11042  if (isOldIE) 
11043   image.style.removeAttribute("background-image");
11044  else 
11045   image.style.backgroundImage = "";
11046 };
11047 ASPx.ASPxImageLoad.prepareImageBackground = function (image, isOldIE) {
11048  ASPx.ASPxImageLoad.removeASPxImageBackground(image, isOldIE);
11049  if (image.dxCustomBackgroundImageUrl != "")
11050   image.style.backgroundImage = image.dxCustomBackgroundImageUrl;
11051 };
11052 ASPx.ASPxImageLoad.removeHandlers = function (image) {
11053  image.removeAttribute("onload");
11054  image.removeAttribute("onabort");
11055  image.removeAttribute("onerror");
11056 };
11057 window.ASPx = ASPx;
11058})();
11059(function() {
11060var CheckingScriptObjectCommand = ASPx.CreateClass(null, {
11061 constructor: function(scriptName, markerObjectName) {
11062  this.scriptName = scriptName;
11063  this.markerObjectName = markerObjectName;
11064  this.isExisted = false;
11065 },
11066 Run: function() {
11067  var markerObj = this.GetMarkerObject();
11068  this.isExisted = !!markerObj;
11069  if(this.isExisted)
11070   markerObj.DXPatched = true;
11071 },
11072 GetErrorMessage: function() {
11073  return this.GetErrorMessageCore(true);
11074 },
11075 GetErrorMessageCore: function(isScriptRequired){
11076  var markerObj = this.GetMarkerObject();
11077  if(this.isExisted && markerObj && markerObj.DXPatched || !isScriptRequired && !markerObj)
11078   return null;
11079  if(isScriptRequired && !this.GetMarkerObject()){
11080   if(this.isExisted)
11081    return this.scriptName + " script was attached but has been overridden.";
11082   else
11083    return this.scriptName + " script was not attached.";
11084  }
11085  if(!this.isExisted)
11086   return this.scriptName + " script was attached after DevExpress scripts.";
11087  return this.scriptName + " script was attached multiple times and mixed up with DevExpress scripts.";
11088 },
11089 GetMarkerObject: function() {
11090  return ASPx.GetGlobalObject(this.markerObjectName);
11091 }
11092});
11093var PatchScriptCommand = ASPx.CreateClass(CheckingScriptObjectCommand, {
11094 constructor: function(scriptName, markerObjectName, patchMethod, required) {
11095  this.constructor.prototype.constructor.call(this, scriptName, markerObjectName);
11096  this.required = required;
11097  this.patchMethod = patchMethod;
11098 },
11099 Run: function() {
11100  CheckingScriptObjectCommand.prototype.Run.call(this);
11101  if(this.isExisted)
11102   this.patchMethod();
11103 },
11104 GetErrorMessage: function() {  
11105  return this.GetErrorMessageCore(this.required);
11106 }
11107});
11108var ExternalScriptProcessor = ASPx.CreateClass(null, {
11109 constructor: function() {
11110  this.commands = {};
11111 },
11112 Process: function(scriptName, markerObjectName, patchMethod, required) {
11113  var newCommand = this.CreateCommand(scriptName, markerObjectName, patchMethod, !!required);
11114  var oldCommand = this.commands[markerObjectName];
11115  if(oldCommand) {
11116   if(!oldCommand.patchMethod && !newCommand.patchMethod)
11117    newCommand = null;
11118   else if(newCommand.patchMethod && (!oldCommand.patchMethod || oldCommand.required))
11119    newCommand.required = true;
11120   else if(oldCommand.patchMethod && !newCommand.patchMethod) {
11121    oldCommand.required = true;
11122    newCommand = null;
11123   }
11124  }
11125  if(newCommand) {
11126   this.commands[markerObjectName] = newCommand;
11127   newCommand.Run();
11128  }
11129 },
11130 CreateCommand: function(scriptName, markerObjectName, patchMethod, required) {
11131  if(patchMethod)
11132   return new PatchScriptCommand(scriptName, markerObjectName, patchMethod, required);
11133  return new CheckingScriptObjectCommand(scriptName, markerObjectName);
11134 },
11135 ShowErrorMessages: function() {
11136  var messages = this.GetErrorMessages();
11137  var console = window.console;
11138  if(!messages.length || !console || !ASPx.IsFunction(console.error))
11139   return;
11140  for(var i = 0; i < messages.length; i++) {
11141   console.error(messages[i]);
11142  }
11143  ASPx.ShowKBErrorMessage("Please check the correctness of script registration on the page. For details, see ", "T272309");
11144 },
11145 GetErrorMessages: function() {
11146  var messages = [];
11147  for (var key in this.commands) {
11148   if (this.commands.hasOwnProperty(key)) {
11149    var message = this.commands[key].GetErrorMessage();
11150    if (message)
11151     messages.push(message);
11152   }
11153  }
11154  return messages;
11155 }
11156});
11157ExternalScriptProcessor.Instance = null;
11158ExternalScriptProcessor.getInstance = function() {
11159 if(!ExternalScriptProcessor.Instance)
11160  ExternalScriptProcessor.Instance = new ExternalScriptProcessor();
11161 return ExternalScriptProcessor.Instance;
11162};
11163ASPx.ExternalScriptProcessor = ExternalScriptProcessor;
11164})();
11165(function module(ASPx) {
11166ASPx.modules.Controls = module;
11167var ASPxClientBeginCallbackEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
11168 constructor: function(command){
11169  this.constructor.prototype.constructor.call(this);
11170  this.command = command;
11171 }
11172});
11173var ASPxClientGlobalBeginCallbackEventArgs = ASPx.CreateClass(ASPxClientBeginCallbackEventArgs, {
11174 constructor: function(control, command){
11175  this.constructor.prototype.constructor.call(this, command);
11176  this.control = control;
11177 }
11178});
11179var ASPxClientEndCallbackEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
11180 constructor: function(command){
11181  this.constructor.prototype.constructor.call(this);
11182  this.command = command;
11183 }
11184});
11185var ASPxClientGlobalEndCallbackEventArgs = ASPx.CreateClass(ASPxClientEndCallbackEventArgs, {
11186 constructor: function(control){
11187  this.constructor.prototype.constructor.call(this);
11188  this.control = control;
11189 }
11190});
11191var ASPxClientCustomDataCallbackEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
11192 constructor: function(result) {
11193  this.constructor.prototype.constructor.call(this);
11194  this.result = result;
11195 }
11196});
11197var ASPxClientCallbackErrorEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
11198 constructor: function (message, callbackId) {
11199  this.constructor.prototype.constructor.call(this);
11200  this.message = message;
11201  this.handled = false;
11202  this.callbackId = callbackId;
11203 }
11204});
11205var ASPxClientGlobalCallbackErrorEventArgs = ASPx.CreateClass(ASPxClientCallbackErrorEventArgs, {
11206 constructor: function (control, message, callbackId) {
11207  this.constructor.prototype.constructor.call(this, message, callbackId);
11208  this.control = control;
11209 }
11210});
11211var ASPxClientValidationCompletedEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
11212 constructor: function (container, validationGroup, invisibleControlsValidated, isValid, firstInvalidControl, firstVisibleInvalidControl) {
11213  this.constructor.prototype.constructor.call(this);
11214  this.container = container;
11215  this.validationGroup = validationGroup;
11216  this.invisibleControlsValidated = invisibleControlsValidated;
11217  this.isValid = isValid;
11218  this.firstInvalidControl = firstInvalidControl;
11219  this.firstVisibleInvalidControl = firstVisibleInvalidControl;
11220 }
11221});
11222var ASPxClientControlsInitializedEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
11223 constructor: function(isCallback) {
11224  this.isCallback = isCallback;
11225 }
11226});
11227var ASPxClientControlBeforePronounceEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
11228 constructor: function(messageParts, control){
11229  this.constructor.prototype.constructor.call(this);
11230  this.messageParts = messageParts;
11231  this.control = control;
11232 }
11233});
11234var ASPxClientControlUnloadEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
11235 constructor: function(control){
11236  this.constructor.prototype.constructor.call(this);
11237  this.control = control;
11238 }
11239});
11240var ASPxClientEndFocusEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
11241 constructor: function(item) {
11242  this.constructor.prototype.constructor.call(this);
11243  this.item = item;
11244 }
11245});
11246var ASPxClientItemFocusedEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
11247 constructor: function(item) {
11248  this.constructor.prototype.constructor.call(this);
11249  this.item = item;
11250 }
11251});
11252var BeforeInitCallbackEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
11253 constructor: function(callbackOwnerID){
11254  this.constructor.prototype.constructor.call(this);
11255  this.callbackOwnerID = callbackOwnerID;
11256 }
11257});
11258var ASPxClientBrowserWindowResizedInternalEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
11259 constructor: function(eventInfo) {
11260  this.constructor.prototype.constructor.call(this);
11261  this.htmlEvent = eventInfo.htmlEvent;
11262  this.windowClientWidth = eventInfo.wndWidth;
11263  this.windowClientHeigth = eventInfo.wndHeight;
11264  this.previousWindowClientWidth = eventInfo.prevWndWidth;
11265  this.previousWindowClientHeight = eventInfo.prevWndHeight;
11266  this.virtualKeyboardShownOnAndroid = eventInfo.virtualKeyboardShownOnAndroid;
11267 }
11268});
11269ASPx.createControl = function(type, name, windowName, properties, events, setupMethod, data){
11270 var globalName = windowName && windowName.length > 0 ? windowName : name;
11271 var dxo = new type(name);
11272 var haveWrapper = ASPx.Platform === "NETCORE" && dxo.createWrapper && !DevExpress.AspNetCore.Internal.BackwardCompatibility.useLegacyClientAPI;
11273 if(haveWrapper) {
11274  window[globalName] = dxo.createWrapper();
11275  dxo.aspNetCoreWrapperInstance = window[globalName];
11276 }
11277 else
11278  dxo.InitGlobalVariable(globalName);
11279 if(properties)
11280  dxo.SetProperties(properties);
11281 if(events)
11282  dxo.SetEvents(events);
11283 if(setupMethod)
11284  setupMethod.call(dxo);
11285 if(data)
11286  dxo.SetData(data);
11287 dxo.AfterCreate();
11288};
11289var ASPxClientControlBase = ASPx.CreateClass(null, {
11290 constructor: function(name){
11291  this.name = name;
11292  this.uniqueID = name;   
11293  this.globalName = name;
11294  this.stateObject = null;
11295  this.needEncodeState = true;
11296  this.encodeHtml = true;
11297  this.enabled = true;
11298  this.clientEnabled = true;
11299  this.savedClientEnabled = true;
11300  this.clientVisible = true;
11301  this.accessibilityCompliant = false;
11302  this.parseJSPropertiesOnCallbackError = false;
11303  this.autoPostBack = false;
11304  this.allowMultipleCallbacks = true;
11305  this.callBack = null;
11306  this.enableCallbackAnimation = false;
11307  this.enableSlideCallbackAnimation = false;
11308  this.slideAnimationDirection = null;
11309  this.beginCallbackAnimationProcessing = false;
11310  this.endCallbackAnimationProcessing = false;
11311  this.savedCallbackResult = null;
11312  this.savedCallbacks = null;
11313  this.isCallbackAnimationPrevented = false;
11314  this.lpDelay = 300;
11315  this.lpTimer = -1;
11316  this.requestCount = 0;
11317  this.enableSwipeGestures = false;
11318  this.disableSwipeGestures = false;
11319  this.supportGestures = false;
11320  this.repeatedGestureValue = 0;
11321  this.repeatedGestureCount = 0;
11322  this.isInitialized = false;
11323  this.initialFocused = false;
11324  this.leadingAfterInitCall = ASPxClientControl.LeadingAfterInitCallConsts.None; 
11325  this.serverEvents = [];
11326  this.loadingPanelElement = null;
11327  this.loadingDivElement = null;  
11328  this.hasPhantomLoadingElements = false;
11329  this.mainElement = null;
11330  this.touchUIMouseScroller = null;
11331  this.hiddenFields = {};
11332  this.scPrefix = "dx";
11333  this.callbackHandlersQueue = new ASPx.ControlCallbackHandlersQueue(this);
11334  this.callbackCommand = {};
11335  this.currentCallbackID = -1;
11336  this.InitializeIntersectionObserversManager();
11337  this.Init = new ASPxClientEvent();
11338  this.BeginCallback = new ASPxClientEvent();
11339  this.EndCallback = new ASPxClientEvent();
11340  this.EndCallbackAnimationStart = new ASPxClientEvent();
11341  this.CallbackError = new ASPxClientEvent();
11342  this.CustomDataCallback = new ASPxClientEvent();
11343  this.BeforePronounce = new ASPxClientEvent();
11344  this.Unload = new ASPxClientEvent();
11345  this.Disposed = new ASPxClientEvent(); 
11346  aspxGetControlCollection().Add(this);
11347 },
11348 Initialize: function() {
11349  if(this.callBack != null)
11350   this.InitializeCallBackData();
11351  if (this.useCallbackQueue())
11352   this.callbackQueueHelper = new ASPx.ControlCallbackQueueHelper(this);
11353  ASPx.AccessibilityUtils.createAccessibleBackgrounds(this);
11354  if(this.accessibilityCompliant)
11355   ASPx.AccessibilityPronouncer.EnsureInitialize();
11356 },
11357 FinalizeInitialization: function() { },
11358 InlineInitialize: function() {
11359  this.savedClientEnabled = this.clientEnabled;
11360 },
11361 InitializeGestures: function() {
11362  if(this.isSwipeGesturesEnabled() && this.supportGestures) {
11363   ASPx.GesturesHelper.AddSwipeGestureHandler(this.name, 
11364    function() { return this.GetCallbackAnimationElement(); }.aspxBind(this), 
11365    function(evt) { return this.CanHandleGestureCore(evt); }.aspxBind(this), 
11366    function(value) { return this.AllowStartGesture(value); }.aspxBind(this),
11367    function(value) { return this.StartGesture(); }.aspxBind(this),
11368    function(value) { return this.AllowExecuteGesture(value); }.aspxBind(this),
11369    function(value) { this.ExecuteGesture(value); }.aspxBind(this),
11370    function(value) { this.CancelGesture(value); }.aspxBind(this),
11371    this.GetDefaultanimationEngineType(),
11372    this.rtl
11373   );
11374   if(ASPx.Browser.MSTouchUI)
11375    this.touchUIMouseScroller = ASPx.MouseScroller.Create(
11376     function() { return this.GetCallbackAnimationElement(); }.aspxBind(this),
11377     function() { return null; },
11378     function() { return this.GetCallbackAnimationElement(); }.aspxBind(this),
11379     function(element) { return this.NeedPreventTouchUIMouseScrolling(element); }.aspxBind(this),
11380     true
11381    );
11382  }
11383 },
11384 isSwipeGesturesEnabled: function() {
11385  return !this.disableSwipeGestures && (this.enableSwipeGestures || ASPx.Browser.TouchUI);
11386 },
11387 isSlideCallbackAnimationEnabled: function() {
11388  return this.enableSlideCallbackAnimation || this.isSwipeGesturesEnabled(); 
11389 },
11390 InitGlobalVariable: function(varName){
11391  if(!window) return;
11392  this.globalName = varName;
11393  window[varName] = this;
11394 },
11395 SetElementDisplay: function(element, value, checkCurrentStyle, makeInline) {
11396  ASPx.SetElementDisplay(element, value, checkCurrentStyle, makeInline);
11397 },
11398 SetProperties: function(properties, obj){
11399  if(!obj) obj = this;
11400  var isAspNetCoreWrapperInstanceExist = !!obj.aspNetCoreWrapperInstance;
11401  for(var name in properties){
11402   if(!properties.hasOwnProperty(name)) continue;
11403   obj[name] = properties[name];
11404   if(isAspNetCoreWrapperInstanceExist && name.indexOf("cp") === 0)
11405    obj.aspNetCoreWrapperInstance[name] = properties[name]; 
11406  }
11407 },
11408 SetEvents: function(events, obj){
11409  if(!obj) obj = this;
11410  for(var name in events){
11411   if(events.hasOwnProperty(name) && obj[name] && obj[name].AddHandler)
11412    obj[name].AddHandler(events[name]);
11413  }
11414 },
11415 SetData: function(data){
11416 },
11417 useCallbackQueue: function(){
11418  return false;
11419 },
11420 NeedPreventTouchUIMouseScrolling: function(element) {
11421  return false;
11422 },
11423 InitializeFocus: function() {
11424  if(this.initialFocused && this.IsVisible()) {
11425   if(ASPxClientUtils.iOSPlatform || ASPxClientUtils.androidPlatform)
11426    setTimeout(function() { this.Focus(); }.bind(this), ASPx.FOCUS_TIMEOUT);
11427   else
11428    this.Focus();
11429  }
11430 },
11431 AfterCreate: function() {
11432  this.AddDefaultStateControllerItems();
11433  this.InlineInitialize();
11434  this.InitializeGestures();
11435 },
11436 AfterInitialize: function() {
11437  this.initializeAriaDescriptor();
11438  this.InitializeFocus();
11439  this.isInitialized = true;
11440  this.RaiseInit();
11441  if(this.savedCallbacks) {
11442   for(var i = 0; i < this.savedCallbacks.length; i++) 
11443    this.CreateCallbackInternal(this.savedCallbacks[i].arg, this.savedCallbacks[i].command, 
11444     false, this.savedCallbacks[i].callbackInfo);
11445   this.savedCallbacks = null;
11446  }
11447 },
11448 InitializeCallBackData: function() {
11449 },
11450 AtlasPreInitialize: function() {
11451 },
11452 AtlasInitialize: function() {
11453 },
11454 IsDOMDisposed: function() { 
11455  return !ASPx.IsExistsElement(this.GetMainElement());
11456 },
11457 initializeAriaDescriptor: function() {
11458  if(this.ariaDescription) {
11459   var descriptionObject = ASPx.Json.Eval(this.ariaDescription);
11460   if(descriptionObject) {
11461    this.ariaDescriptor = new AriaDescriptor(this, descriptionObject);
11462    this.applyAccessibilityAttributes(this.ariaDescriptor); 
11463   }
11464  }
11465 },
11466 applyAccessibilityAttributes: function() { },
11467 setAriaDescription: function(selector, argsList) {
11468  if(this.ariaDescriptor)
11469   this.ariaDescriptor.setDescription(selector, argsList || [[]]);
11470 },
11471 allowRestoreFocusOnCallbacks: function(){
11472  return this.accessibilityCompliant;
11473 },
11474 HtmlEncode: function(text) {
11475  return this.encodeHtml ? ASPx.Str.EncodeHtml(text) : text;
11476 },
11477 IsServerEventAssigned: function(eventName){
11478  return ASPx.Data.ArrayIndexOf(this.serverEvents, eventName) >= 0;
11479 },
11480 OnPost: function(args){
11481  this.SerializeStateHiddenField();
11482 },
11483 SerializeStateHiddenField: function() {
11484  this.UpdateStateObject();
11485  if(this.stateObject != null)
11486   this.UpdateStateHiddenField();
11487 },
11488 OnPostFinalization: function(args){
11489 },
11490 UpdateStateObject: function(){
11491 },
11492 UpdateStateObjectWithObject: function(obj){
11493  if(!obj) return;
11494  if(!this.stateObject)
11495   this.stateObject = { };
11496  for(var key in obj)
11497   if(obj.hasOwnProperty(key))
11498    this.stateObject[key] = obj[key];
11499 },
11500 UpdateStateHiddenField: function() {
11501  var stateHiddenField = this.GetStateHiddenField();
11502  if(stateHiddenField) {
11503   var stateObjectStr = ASPx.Json.ToJson(this.stateObject, !this.needEncodeState);
11504   stateHiddenField.value = this.needEncodeState ? ASPx.Str.EncodeHtml(stateObjectStr) : stateObjectStr;
11505  }
11506 },
11507 GetStateHiddenField: function() {
11508  return this.GetHiddenField(this.GetStateHiddenFieldName(), this.GetStateHiddenFieldID(), 
11509   this.GetStateHiddenFieldParent(), this.GetStateHiddenFieldOrigin());
11510 },
11511 GetStateHiddenFieldName: function() {
11512  return this.uniqueID;
11513 },
11514 GetStateHiddenFieldID: function() {
11515  return this.name + "_State";
11516 },
11517 GetStateHiddenFieldOrigin: function() {
11518  return this.GetMainElement();
11519 },
11520 GetStateHiddenFieldParent: function() {
11521  var element = this.GetStateHiddenFieldOrigin();
11522  return element ? element.parentNode : null;
11523 },
11524 GetHiddenField: function(name, id, parent, beforeElement) {
11525  var hiddenField = this.hiddenFields[id];
11526  if(!hiddenField || !ASPx.IsValidElement(hiddenField)) {
11527   if(parent) {
11528    var existingHiddenField = ASPx.GetElementById(this.GetStateHiddenFieldID());
11529    this.hiddenFields[id] = hiddenField = existingHiddenField || ASPx.CreateHiddenField(name, id);
11530    if(existingHiddenField)
11531     return existingHiddenField;
11532    if(beforeElement)
11533     parent.insertBefore(hiddenField, beforeElement);
11534    else
11535     parent.appendChild(hiddenField);
11536   }
11537  }
11538  return hiddenField;
11539 },
11540 GetChildElement: function(idPostfix){
11541  var mainElement = this.GetMainElement();
11542  if(idPostfix.charAt && idPostfix.charAt(0) !== "_")
11543   idPostfix = "_" + idPostfix;
11544  return mainElement ? ASPx.CacheHelper.GetCachedChildById(this, mainElement, this.name + idPostfix) : null;
11545 },
11546 getChildControl: function(idPostfix) {
11547  var result = null;
11548  var childControlId = this.getChildControlUniqueID(idPostfix);
11549  ASPx.GetControlCollection().ProcessControlsInContainer(this.GetMainElement(), function(control) {
11550   if(control.uniqueID == childControlId)
11551    result = control;
11552  });
11553  return result;  
11554 },
11555 getChildControlUniqueID: function(idPostfix) {
11556  idPostfix = idPostfix.split("_").join("$");
11557  if(idPostfix.charAt && idPostfix.charAt(0) !== "$")
11558   idPostfix = "$" + idPostfix;
11559  return this.uniqueID + idPostfix;  
11560 },
11561 getInnerControl: function(idPostfix) {
11562  var name = this.name + idPostfix;
11563  var result = window[name];
11564  return result && Ident.IsASPxClientControl(result)
11565   ? result
11566   : null;
11567 },
11568 GetParentForm: function(){
11569  return ASPx.GetParentByTagName(this.GetMainElement(), "FORM");
11570 },
11571 GetMainElement: function(){
11572  if(!ASPx.IsExistsElement(this.mainElement))
11573   this.mainElement = ASPx.GetElementById(this.GetMainElementId());
11574  return this.mainElement;
11575 },
11576 GetMainElementId: function() {
11577  return this.name;
11578 },
11579 IsLoadingContainerVisible: function(){
11580  return this.IsVisible();
11581 },
11582 GetLoadingPanelElement: function(){
11583  return ASPx.GetElementById(this.name + "_LP");
11584 },
11585 GetClonedLoadingPanel: function(){
11586  return document.getElementById(this.GetLoadingPanelElement().id + "V"); 
11587 },
11588 CloneLoadingPanel: function(element, parent) {
11589  var clone = element.cloneNode(true);
11590  clone.id = element.id + "V";
11591  parent.appendChild(clone);
11592  return clone;
11593 },
11594 CreateLoadingPanelWithoutBordersInsideContainer: function(container) {
11595  var loadingPanel = this.CreateLoadingPanelInsideContainer(container, false, true, true);
11596  var contentStyle = ASPx.GetCurrentStyle(container);
11597  if(!loadingPanel || !contentStyle)
11598   return;
11599  var elements = [ ];
11600  var table = (loadingPanel.tagName == "TABLE") ? loadingPanel : ASPx.GetNodeByTagName(loadingPanel, "TABLE", 0);
11601  if(table != null)
11602   elements.push(table);
11603  else
11604   elements.push(loadingPanel);
11605  var cells = ASPx.GetNodesByTagName(loadingPanel, "TD");
11606  if(!cells) cells = [ ];
11607  for(var i = 0; i < cells.length; i++)
11608   elements.push(cells[i]);
11609  for(var i = 0; i < elements.length; i++) {
11610   var el = elements[i];
11611   el.style.backgroundColor = contentStyle.backgroundColor;
11612   ASPx.RemoveBordersAndShadows(el);
11613  }
11614 },
11615 CreateLoadingPanelInsideContainer: function(parentElement, hideContent, collapseHeight, collapseWidth) {
11616  if(this.ShouldHideExistingLoadingElements())
11617   this.HideLoadingPanel();
11618  if(parentElement == null)
11619   return null;
11620  if(!this.IsLoadingContainerVisible()) {
11621   this.hasPhantomLoadingElements = true;
11622   return null;
11623  }
11624  var element = this.GetLoadingPanelElement();
11625  if(element != null){
11626   var width = collapseWidth ? 0 : ASPx.GetClearClientWidth(parentElement);
11627   var height = collapseHeight ? 0 : ASPx.GetClearClientHeight(parentElement);
11628   if(hideContent){
11629    for(var i = parentElement.childNodes.length - 1; i > -1; i--){
11630     if(parentElement.childNodes[i].style)
11631      parentElement.childNodes[i].style.display = "none";
11632     else if(parentElement.childNodes[i].nodeType == 3) 
11633      parentElement.removeChild(parentElement.childNodes[i]);
11634    }
11635   }
11636   else
11637    parentElement.innerHTML = "";
11638   var table = document.createElement("TABLE");
11639   parentElement.appendChild(table);
11640   table.border = 0;
11641   table.cellPadding = 0;
11642   table.cellSpacing = 0;
11643   ASPx.SetStyles(table, {
11644    width: (width > 0) ? width : "100%",
11645    height: (height > 0) ? height : "100%"
11646   });
11647   var tbody = document.createElement("TBODY");
11648   table.appendChild(tbody);
11649   var tr = document.createElement("TR");
11650   tbody.appendChild(tr);
11651   var td = document.createElement("TD");
11652   tr.appendChild(td);
11653   td.align = "center";
11654   td.vAlign = "middle";
11655   element = this.CloneLoadingPanel(element, td);
11656   ASPx.SetElementDisplay(element, true);
11657   this.loadingPanelElement = element;
11658   return element;
11659  } else
11660   parentElement.innerHTML = "&nbsp;";
11661  return null;
11662 },
11663 CreateLoadingPanelWithAbsolutePosition: function(parentElement, offsetElement) {
11664  if(this.ShouldHideExistingLoadingElements())
11665   this.HideLoadingPanel();
11666  if(parentElement == null)
11667   return null;
11668  if(!this.IsLoadingContainerVisible()) {
11669   this.hasPhantomLoadingElements = true;
11670   return null;
11671  }
11672  if(!offsetElement)
11673   offsetElement = parentElement;
11674  var element = this.GetLoadingPanelElement();
11675  if(element != null) {
11676   element = this.CloneLoadingPanel(element, parentElement);
11677   ASPx.SetStyles(element, {
11678    position: "absolute"
11679   });
11680   ASPx.SetElementDisplay(element, true);
11681   ASPx.Evt.AttachEventToElement(element, ASPx.Evt.GetMouseWheelEventName(), ASPx.Evt.PreventEvent);
11682   this.SetLoadingPanelLocation(offsetElement, element);
11683   this.loadingPanelElement = element;
11684   return element;
11685  }
11686  return null;
11687 },
11688 CreateLoadingPanelInline: function(parentElement, centerInParent){
11689  if(this.ShouldHideExistingLoadingElements())
11690   this.HideLoadingPanel();
11691  if(parentElement == null)
11692   return null;
11693  if(!this.IsLoadingContainerVisible()) {
11694   this.hasPhantomLoadingElements = true;
11695   return null;
11696  }
11697  var element = this.GetLoadingPanelElement();
11698  if(element != null) {
11699   element = this.CloneLoadingPanel(element, parentElement);
11700   if(centerInParent){
11701    ASPx.SetElementDisplay(element, true);
11702    parentElement.style.textAlign = "center";
11703   }
11704   else
11705    ASPx.SetElementDisplay(element, true);
11706   this.loadingPanelElement = element;
11707   return element;
11708  }
11709  return null;
11710 },
11711 ShowLoadingPanel: function() {
11712 },
11713 ShowLoadingElements: function() {
11714  if(this.InCallback() || this.lpTimer > -1) return;
11715  this.ShowLoadingDiv();
11716  if(this.IsCallbackAnimationEnabled())
11717   this.StartBeginCallbackAnimation();
11718  else
11719   this.ShowLoadingElementsInternal();
11720 },
11721 ShowLoadingElementsInternal: function() {
11722  if(this.lpDelay > 0 && !this.IsCallbackAnimationEnabled()) 
11723   this.lpTimer = window.setTimeout(function() { 
11724    this.ShowLoadingPanelOnTimer(); 
11725   }.aspxBind(this), this.lpDelay);
11726  else {
11727   this.RestoreLoadingDivOpacity();
11728   this.ShowLoadingPanel();
11729  }
11730 },
11731 GetLoadingPanelOffsetElement: function (baseElement) {
11732  if(this.IsCallbackAnimationEnabled()) {
11733   var element = this.GetLoadingPanelCallbackAnimationOffsetElement();
11734   if(element) {
11735    var container = typeof(ASPx.AnimationHelper) != "undefined" ? ASPx.AnimationHelper.findSlideAnimationContainer(element) : null;
11736    if(container)
11737     return container.parentNode.parentNode;
11738    else
11739     return element;
11740   }
11741  }
11742  return baseElement;
11743 },
11744 GetLoadingPanelCallbackAnimationOffsetElement: function () {
11745  return this.GetCallbackAnimationElement();
11746 },
11747 IsCallbackAnimationEnabled: function () {
11748  return (this.enableCallbackAnimation || this.isSlideCallbackAnimationEnabled()) && !this.isCallbackAnimationPrevented;
11749 },
11750 GetDefaultanimationEngineType: function() {
11751  return ASPx.AnimationEngineType.DEFAULT;
11752 },
11753 StartBeginCallbackAnimation: function () {
11754  this.beginCallbackAnimationProcessing = true;
11755  this.isCallbackFinished = false;
11756  var element = this.GetCallbackAnimationElement();
11757  if (element && this.isSlideCallbackAnimationEnabled() && this.slideAnimationDirection)
11758   ASPx.AnimationHelper.slideOut(element, this.slideAnimationDirection, this.FinishBeginCallbackAnimation.aspxBind(this), this.GetDefaultanimationEngineType(), this.rtl);
11759  else if(element && this.enableCallbackAnimation) 
11760   ASPx.AnimationHelper.fadeOut(element, this.FinishBeginCallbackAnimation.aspxBind(this), null, ASPx.AnimationEngineType.JS);
11761  else
11762   this.FinishBeginCallbackAnimation();
11763 },
11764 CancelBeginCallbackAnimation: function() {
11765  if(this.beginCallbackAnimationProcessing) {
11766   this.beginCallbackAnimationProcessing = false;
11767   var element = this.GetCallbackAnimationElement();
11768   ASPx.AnimationHelper.cancelAnimation(element);
11769  }
11770 },
11771 FinishBeginCallbackAnimation: function () {
11772  this.beginCallbackAnimationProcessing = false;
11773  if(!this.isCallbackFinished)
11774   this.ShowLoadingElementsInternal();
11775  else {
11776   this.DoCallback(this.savedCallbackResult);
11777   this.savedCallbackResult = null;
11778  }
11779 },
11780 CheckBeginCallbackAnimationInProgress: function(callbackResult) {
11781  if(this.beginCallbackAnimationProcessing) {
11782   this.savedCallbackResult = callbackResult;
11783   this.isCallbackFinished = true;
11784   return true;
11785  }
11786  return false;
11787 },
11788 StartEndCallbackAnimation: function () {
11789  this.HideLoadingPanel();
11790  this.SetInitialLoadingDivOpacity();
11791  this.RaiseEndCallbackAnimationStart();
11792  this.endCallbackAnimationProcessing = true;
11793  var element = this.GetCallbackAnimationElement();
11794  if(element && this.isSlideCallbackAnimationEnabled() && this.slideAnimationDirection) 
11795   ASPx.AnimationHelper.slideIn(element, this.slideAnimationDirection, this.FinishEndCallbackAnimation.aspxBind(this), this.GetDefaultanimationEngineType(), this.rtl);
11796  else if(element && this.enableCallbackAnimation) 
11797   ASPx.AnimationHelper.fadeIn(element, this.FinishEndCallbackAnimation.aspxBind(this), null, ASPx.AnimationEngineType.JS);
11798  else
11799   this.FinishEndCallbackAnimation();
11800  this.slideAnimationDirection = null;
11801 },
11802 FinishEndCallbackAnimation: function () {
11803  this.DoEndCallback();
11804  this.endCallbackAnimationProcessing = false;
11805  this.CheckRepeatGesture();
11806 },
11807 CheckEndCallbackAnimationNeeded: function() {
11808  if(!this.endCallbackAnimationProcessing && this.requestCount == 1) {
11809   this.StartEndCallbackAnimation();
11810   return true;
11811  }
11812  return false;
11813 },
11814 PreventCallbackAnimation: function() {
11815  this.isCallbackAnimationPrevented = true;
11816 },
11817 GetCallbackAnimationElement: function() {
11818  return null;
11819 },
11820 AssignSlideAnimationDirectionByPagerArgument: function(arg, currentPageIndex) {
11821  this.slideAnimationDirection = null;
11822  if(this.isSlideCallbackAnimationEnabled() && typeof(ASPx.AnimationHelper) != "undefined") {
11823   if(arg == PagerCommands.Next || arg == PagerCommands.Last)
11824    this.slideAnimationDirection = ASPx.AnimationHelper.SLIDE_LEFT_DIRECTION;
11825   else if(arg == PagerCommands.First || arg == PagerCommands.Prev)
11826    this.slideAnimationDirection = ASPx.AnimationHelper.SLIDE_RIGHT_DIRECTION;
11827   else if(!isNaN(currentPageIndex) && arg.indexOf(PagerCommands.PageNumber) == 0) {
11828    var newPageIndex = parseInt(arg.substring(2));
11829    if (!isNaN(newPageIndex)) {
11830     var leftDir = this.rtl ? ASPx.AnimationHelper.SLIDE_LEFT_DIRECTION : ASPx.AnimationHelper.SLIDE_RIGHT_DIRECTION;
11831     var rightDir = this.rtl ? ASPx.AnimationHelper.SLIDE_RIGHT_DIRECTION : ASPx.AnimationHelper.SLIDE_LEFT_DIRECTION;
11832     this.slideAnimationDirection = newPageIndex < currentPageIndex ? leftDir : rightDir;
11833    }
11834   }
11835  }
11836 },
11837 TryShowPhantomLoadingElements: function () {
11838  if(this.hasPhantomLoadingElements && this.InCallback()) {
11839   this.hasPhantomLoadingElements = false;
11840   this.ShowLoadingDivAndPanel();
11841  }
11842 },
11843 ShowLoadingDivAndPanel: function () {
11844  this.ShowLoadingDiv();
11845  this.RestoreLoadingDivOpacity();
11846  this.ShowLoadingPanel();
11847 },
11848 HideLoadingElements: function() {
11849  this.CancelBeginCallbackAnimation();
11850  this.HideLoadingPanel();
11851  this.HideLoadingDiv();
11852 },
11853 ShowLoadingPanelOnTimer: function() {
11854  this.ClearLoadingPanelTimer();
11855  if(!this.IsDOMDisposed()) {
11856   this.RestoreLoadingDivOpacity();
11857   this.ShowLoadingPanel();
11858  }
11859 },
11860 ClearLoadingPanelTimer: function() {
11861  this.lpTimer = ASPx.Timer.ClearTimer(this.lpTimer);  
11862 },
11863 HideLoadingPanel: function() {
11864  this.ClearLoadingPanelTimer();
11865  this.hasPhantomLoadingElements = false;
11866  if(ASPx.IsExistsElement(this.loadingPanelElement)) {
11867   ASPx.RemoveElement(this.loadingPanelElement);
11868   this.loadingPanelElement = null;
11869  }
11870 },
11871 SetLoadingPanelLocation: function(offsetElement, loadingPanel, x, y, offsetX, offsetY) {
11872  if(!ASPx.IsExists(x) || !ASPx.IsExists(y)){
11873   var x1 = ASPx.GetAbsoluteX(offsetElement);
11874   var y1 = ASPx.GetAbsoluteY(offsetElement);
11875   var x2 = x1;
11876   var y2 = y1;
11877   if(offsetElement == document.body) {
11878    x1 = 0;
11879    y1 = 0;
11880    x2 = ASPx.GetDocumentMaxClientWidth();
11881    y2 = ASPx.GetDocumentMaxClientHeight();
11882   }
11883   else{
11884    x2 += offsetElement.offsetWidth;
11885    y2 += offsetElement.offsetHeight;
11886   }
11887   if(x1 < ASPx.GetDocumentScrollLeft())
11888    x1 = ASPx.GetDocumentScrollLeft();
11889   if(y1 < ASPx.GetDocumentScrollTop())
11890    y1 = ASPx.GetDocumentScrollTop();
11891   if(x2 > ASPx.GetDocumentScrollLeft() + ASPx.GetDocumentClientWidth())
11892    x2 = ASPx.GetDocumentScrollLeft() + ASPx.GetDocumentClientWidth();
11893   if(y2 > ASPx.GetDocumentScrollTop() + ASPx.GetDocumentClientHeight())
11894    y2 = ASPx.GetDocumentScrollTop() + ASPx.GetDocumentClientHeight();
11895   x = x1 + ((x2 - x1 - loadingPanel.offsetWidth) / 2);
11896   y = y1 + ((y2 - y1 - loadingPanel.offsetHeight) / 2);
11897  }
11898  if(ASPx.IsExists(offsetX) && ASPx.IsExists(offsetY)){
11899   x += offsetX;
11900   y += offsetY;
11901  }
11902  x = ASPx.PrepareClientPosForElement(x, loadingPanel, true);
11903  y = ASPx.PrepareClientPosForElement(y, loadingPanel, false);
11904  ASPx.SetStyles(loadingPanel, { left: x, top: y });
11905 },
11906 GetLoadingDiv: function(){
11907  return ASPx.GetElementById(this.name + "_LD");
11908 },
11909 CreateLoadingDiv: function(parentElement, offsetElement){
11910  if(this.ShouldHideExistingLoadingElements())
11911   this.HideLoadingDiv();
11912  if(parentElement == null) 
11913   return null;
11914  if(!this.IsLoadingContainerVisible()) {
11915   this.hasPhantomLoadingElements = true;
11916   return null;
11917  }
11918  if(!offsetElement)
11919   offsetElement = parentElement;
11920  var div = this.GetLoadingDiv();
11921  if(div != null){
11922   div = div.cloneNode(true);
11923   parentElement.appendChild(div);
11924   ASPx.SetElementDisplay(div, true);
11925   ASPx.Evt.AttachEventToElement(div, ASPx.TouchUIHelper.touchMouseDownEventName, ASPx.Evt.PreventEvent);
11926   ASPx.Evt.AttachEventToElement(div, ASPx.TouchUIHelper.touchMouseMoveEventName, ASPx.Evt.PreventEvent);
11927   ASPx.Evt.AttachEventToElement(div, ASPx.TouchUIHelper.touchMouseUpEventName, ASPx.Evt.PreventEvent);
11928   ASPx.Evt.AttachEventToElement(div, ASPx.Evt.GetMouseWheelEventName(), ASPx.Evt.PreventEvent);
11929   this.SetLoadingDivBounds(offsetElement, div);
11930   this.loadingDivElement = div;
11931   this.SetInitialLoadingDivOpacity();
11932   return div;
11933  }
11934  return null;
11935 },
11936 SetInitialLoadingDivOpacity: function() {
11937  if(!this.loadingDivElement) return;
11938  ASPx.Attr.SaveStyleAttribute(this.loadingDivElement, "opacity");
11939  ASPx.Attr.SaveStyleAttribute(this.loadingDivElement, "filter");
11940  ASPx.SetElementOpacity(this.loadingDivElement, 0.01);
11941 },
11942 RestoreLoadingDivOpacity: function() {
11943  if(!this.loadingDivElement) return;
11944  ASPx.Attr.RestoreStyleAttribute(this.loadingDivElement, "opacity");
11945  ASPx.Attr.RestoreStyleAttribute(this.loadingDivElement, "filter");
11946 },
11947 SetLoadingDivBounds: function(offsetElement, loadingDiv) {
11948  var absX = (offsetElement == document.body) ? 0 : ASPx.GetAbsoluteX(offsetElement);
11949  var absY = (offsetElement == document.body) ? 0 : ASPx.GetAbsoluteY(offsetElement);
11950  ASPx.SetStyles(loadingDiv, {
11951   left: ASPx.PrepareClientPosForElement(absX, loadingDiv, true),
11952   top: ASPx.PrepareClientPosForElement(absY, loadingDiv, false)
11953  });
11954  var width = (offsetElement == document.body) ? ASPx.GetDocumentWidth() : offsetElement.offsetWidth;
11955  var height = (offsetElement == document.body) ? ASPx.GetDocumentHeight() : offsetElement.offsetHeight;
11956  if(height < 0) 
11957   height = 0;
11958  ASPx.SetStyles(loadingDiv, { width: width, height: height });
11959  var correctedWidth = 2 * width - loadingDiv.offsetWidth;
11960  if(correctedWidth <= 0) correctedWidth = width;
11961  var correctedHeight = 2 * height - loadingDiv.offsetHeight;
11962  if(correctedHeight <= 0) correctedHeight = height;
11963  ASPx.SetStyles(loadingDiv, { width: correctedWidth, height: correctedHeight });
11964 },
11965 ShowLoadingDiv: function() {
11966 },
11967 HideLoadingDiv: function() {
11968  this.hasPhantomLoadingElements = false;
11969  if(ASPx.IsExistsElement(this.loadingDivElement)){
11970   ASPx.RemoveElement(this.loadingDivElement);
11971   this.loadingDivElement = null;
11972  }
11973 },
11974 CanHandleGesture: function(evt) {
11975  return false;
11976 },
11977 CanHandleGestureCore: function(evt) {
11978  var source = ASPx.Evt.GetEventSource(evt);
11979  if(ASPx.GetIsParent(this.loadingPanelElement, source) || ASPx.GetIsParent(this.loadingDivElement, source))
11980   return true; 
11981  var callbackAnimationElement = this.GetCallbackAnimationElement();
11982  if(!callbackAnimationElement)
11983   return false;
11984  var animationContainer = ASPx.AnimationHelper.getSlideAnimationContainer(callbackAnimationElement, false, false);
11985  if(animationContainer && ASPx.GetIsParent(animationContainer, source) && !ASPx.GetIsParent(animationContainer.childNodes[0], source))
11986   return true; 
11987  return this.CanHandleGesture(evt); 
11988 },
11989 AllowStartGesture: function() {
11990  return !this.beginCallbackAnimationProcessing && !this.endCallbackAnimationProcessing;
11991 },
11992 StartGesture: function() {
11993 },
11994 AllowExecuteGesture: function(value) {
11995  return false;
11996 },
11997 ExecuteGesture: function(value) {
11998 },
11999 CancelGesture: function(value) {
12000  if(this.repeatedGestureCount === 0) {
12001   this.repeatedGestureValue = value;
12002   this.repeatedGestureCount = 1;
12003  }
12004  else {
12005   if(this.repeatedGestureValue * value > 0)
12006    this.repeatedGestureCount++;
12007   else
12008    this.repeatedGestureCount--;
12009   if(this.repeatedGestureCount === 0)
12010    this.repeatedGestureCount = 0;
12011  }
12012 },
12013 CheckRepeatGesture: function() {
12014  if(this.repeatedGestureCount !== 0) {
12015   if(this.AllowExecuteGesture(this.repeatedGestureValue))
12016    this.ExecuteGesture(this.repeatedGestureValue, this.repeatedGestureCount);
12017   this.repeatedGestureValue = 0;
12018   this.repeatedGestureCount = 0;
12019  }
12020 },
12021 AllowExecutePagerGesture: function (pageIndex, pageCount, value) {
12022  if(pageIndex < 0) return false;
12023  if(pageCount <= 1) return false;
12024  if(value > 0 && pageIndex === 0) return false;
12025  if(value < 0 && pageIndex === pageCount - 1) return false;
12026  return true;
12027 },
12028 ExecutePagerGesture: function(pageIndex, pageCount, value, count, method) {
12029  if(!count) count = 1;
12030  var pageIndex = pageIndex + (value < 0 ? count : -count);
12031  if(pageIndex < 0) pageIndex = 0;
12032  if(pageIndex > pageCount - 1) pageIndex = pageCount - 1;
12033  method(PagerCommands.PageNumber + pageIndex);
12034 },
12035 RaiseInit: function(){
12036  if(!this.Init.IsEmpty()){
12037   var args = new ASPxClientEventArgs();
12038   this.Init.FireEvent(this, args);
12039  }
12040 },
12041 RaiseBeginCallbackInternal: function(command){
12042  if(!this.BeginCallback.IsEmpty()){
12043   var args = new ASPxClientBeginCallbackEventArgs(command);
12044   this.BeginCallback.FireEvent(this, args);
12045  }
12046 },
12047 RaiseEndCallbackInternal: function(command) {
12048  if(!this.EndCallback.IsEmpty()){
12049   var args = new ASPxClientEndCallbackEventArgs(command);
12050   this.EndCallback.FireEvent(this, args);
12051  }
12052 },
12053 RaiseCallbackErrorInternal: function(message, callbackId) {
12054  if(!this.CallbackError.IsEmpty()) {
12055   var args = new ASPxClientCallbackErrorEventArgs(message, callbackId);
12056   this.CallbackError.FireEvent(this, args);
12057   if(args.handled)
12058    return { isHandled: true, errorMessage: args.message };
12059  }
12060 },
12061 RaiseBeginCallback: function(command){
12062  this.RaiseBeginCallbackInternal(command);    
12063  aspxGetControlCollection().RaiseBeginCallback(this, command);
12064 },
12065 RaiseEndCallback: function(command){
12066  this.RaiseEndCallbackInternal(command);
12067  aspxGetControlCollection().RaiseEndCallback(this, command);
12068 },
12069 RaiseCallbackError: function (message, callbackId) {
12070  var result = this.RaiseCallbackErrorInternal(message, callbackId);
12071  if(!result) 
12072   result = aspxGetControlCollection().RaiseCallbackError(this, message, callbackId);
12073  return result;
12074 },
12075 RaiseEndCallbackAnimationStart: function(){
12076  if(!this.EndCallbackAnimationStart.IsEmpty()){
12077   var args = new ASPxClientEventArgs();
12078   this.EndCallbackAnimationStart.FireEvent(this, args);
12079  }
12080 },
12081 RaiseBeforePronounce: function(message) {
12082  var args = new ASPxClientControlBeforePronounceEventArgs(message, this);
12083  if(!this.BeforePronounce.IsEmpty())
12084   this.BeforePronounce.FireEvent(this, args);
12085  return args;
12086 },
12087 RaiseUnload: function() {
12088  var args = new ASPxClientControlUnloadEventArgs(this);
12089  if(!this.Unload.IsEmpty())
12090   this.Unload.FireEvent(this, args);
12091 },
12092 RaiseDisposed: function() {
12093  this.Disposed.FireEvent(this, new ASPxClientEventArgs(this));
12094 },
12095 SendMessageToAssistiveTechnology: function(message) {
12096  if(!this.accessibilityCompliant)
12097   return;
12098  this.PronounceMessageInternal(message, ASPx.AccessibilityPronouncerType.live);
12099 },
12100 PronounceMessageInternal: function(messageArg, type) {
12101  var message = messageArg;
12102  if(!ASPx.Ident.IsArray(messageArg))
12103   message = [messageArg];
12104  var args = this.RaiseBeforePronounce(message);
12105  ASPx.AccessibilityPronouncer.Pronounce(args, type);
12106 },
12107 IsVisible: function() {
12108  var element = this.GetMainElement();
12109  return ASPx.IsElementVisible(element);
12110 },
12111 IsDisplayedElement: function(element) {
12112  while(element && element.tagName != "BODY") {
12113   if(!ASPx.GetElementDisplay(element)) 
12114    return false;
12115   element = element.parentNode;
12116  }
12117  return true;
12118 },
12119 IsDisplayed: function() {
12120  return this.IsDisplayedElement(this.GetMainElement());
12121 },
12122 IsHiddenElement: function(element) {
12123  return element && element.offsetWidth == 0 && element.offsetHeight == 0;
12124 },
12125 IsHidden: function() {
12126  return this.IsHiddenElement(this.GetMainElement());
12127 },
12128 IsDisposed: function() {
12129  return this.disposed;
12130 },
12131 GetParentControl: function() {
12132  var mainElement = this.getActualMainElement();
12133  var popupPostfix = ASPx.PCWIdSuffix + "-1";
12134  var result = null;
12135  ASPx.GetParent(mainElement, function(element) {
12136   if(element === mainElement || !element.id)
12137    return false;
12138   var controlName = element.id.replace(popupPostfix, "");
12139   result = ASPx.GetControlCollection().Get(controlName);
12140   return !!result;
12141  });
12142  return result;
12143 },
12144 getActualMainElement: function() { return this.GetMainElement(); },
12145 findParentByType: function (type) {
12146  var ctrl = this;
12147  while (ctrl) {
12148   var parent = ctrl.GetParentControl();
12149   if (parent && parent instanceof type)
12150    return parent;
12151   ctrl = parent;
12152  }
12153  return null;
12154 },
12155 Focus: function() {
12156 },
12157 GetClientVisible: function(){
12158  return this.GetVisible();
12159 },
12160 SetClientVisible: function(visible){
12161  this.SetVisible(visible);
12162 },
12163 GetVisible: function(){
12164  return this.clientVisible;
12165 },
12166 SetVisible: function(visible){
12167  if(this.clientVisible != visible){
12168   this.clientVisible = visible;
12169   ASPx.SetElementDisplay(this.GetMainElement(), visible);
12170   if(visible) {
12171    this.AdjustControl();
12172    var mainElement = this.GetMainElement();
12173    if(mainElement)
12174     aspxGetControlCollection().AdjustControls(mainElement);
12175   }
12176  }
12177 },
12178 GetEnabled: function() {
12179  return this.clientEnabled;
12180 },
12181 SetEnabled: function(enabled) {
12182  this.clientEnabled = enabled;
12183  if(ASPxClientControl.setEnabledLocked)
12184   return;
12185  else
12186   ASPxClientControl.setEnabledLocked = true;
12187  this.savedClientEnabled = enabled;
12188  aspxGetControlCollection().ProcessControlsInContainer(this.GetMainElement(), function(control) {
12189   if(ASPx.IsFunction(control.SetEnabled))
12190    control.SetEnabled(enabled && control.savedClientEnabled);
12191  });
12192  delete ASPxClientControl.setEnabledLocked;
12193 },
12194 InCallback: function() {
12195  return this.requestCount > 0;
12196 },
12197 DoBeginCallback: function(command) {
12198  this.RaiseBeginCallback(command || "");
12199  aspxGetControlCollection().Before_WebForm_InitCallback(this.name);
12200  if(typeof(WebForm_InitCallback) != "undefined" && WebForm_InitCallback) {
12201   __theFormPostData = "";
12202   __theFormPostCollection = [ ];
12203   this.ClearPostBackEventInput("__EVENTTARGET");
12204   this.ClearPostBackEventInput("__EVENTARGUMENT");
12205   WebForm_InitCallback();
12206   this.savedFormPostData = __theFormPostData;
12207   this.savedFormPostCollection = __theFormPostCollection;
12208  }
12209 },
12210 ClearPostBackEventInput: function(id){
12211  var element = ASPx.GetElementById(id);
12212  if(element != null) element.value = "";
12213 },
12214 PerformDataCallback: function(arg, handler) {
12215  this.CreateCustomDataCallback(arg, "", handler);
12216 },
12217 sendCallbackViaQueue: function (prefix, arg, showLoadingPanel, context, handler, onBeforeSend) {
12218  if (!this.useCallbackQueue())
12219   return false;
12220  var context = context || this;
12221  var token = this.callbackQueueHelper.sendCallback(ASPx.FormatCallbackArg(prefix, arg), context, handler || context.OnCallback, prefix, onBeforeSend);
12222  if (showLoadingPanel)
12223   this.callbackQueueHelper.showLoadingElements();
12224  return token;
12225 },
12226 CreateCallback: function (arg, command, handler) {
12227  var callbackInfo = this.CreateCallbackInfo(ASPx.CallbackType.Common, handler || null);
12228  var callbackID = this.CreateCallbackByInfo(arg, command, callbackInfo);
12229  return callbackID;
12230 },
12231 CreateCustomDataCallback: function(arg, command, handler) {
12232  var callbackInfo = this.CreateCallbackInfo(ASPx.CallbackType.Data, handler);
12233  this.CreateCallbackByInfo(arg, command, callbackInfo);
12234 },
12235 CreateCallbackByInfo: function(arg, command, callbackInfo) {
12236  if(!this.CanCreateCallback()) return;
12237  var callbackID;
12238  if(typeof(WebForm_DoCallback) != "undefined" && WebForm_DoCallback && ASPx.documentLoaded || ASPx.Platform === "NETCORE")
12239   callbackID = this.CreateCallbackInternal(arg, command, true, callbackInfo);
12240  else {
12241   if(!this.savedCallbacks)
12242    this.savedCallbacks = [];
12243   var callbackInfo = { arg: arg, command: command, callbackInfo: callbackInfo };
12244   if(this.allowMultipleCallbacks)
12245    this.savedCallbacks.push(callbackInfo);
12246   else
12247    this.savedCallbacks[0] = callbackInfo;
12248  }
12249  return callbackID;
12250 },
12251 CreateCallbackInternal: function(arg, command, viaTimer, callbackInfo) {
12252  var watcher = ASPx.ControlUpdateWatcher.getInstance();
12253  if(watcher && !watcher.CanSendCallback(this, arg)) {
12254   this.CancelCallbackInternal();
12255   return;
12256  }
12257  this.requestCount++;
12258  this.DoBeginCallback(command);
12259  if(typeof(arg) == "undefined")
12260   arg = "";
12261  if(typeof(command) == "undefined")
12262   command = "";
12263  var callbackID = this.SaveCallbackInfo(callbackInfo, command),
12264   customArgs = this.GetCustomCallbackArgs();
12265  if(viaTimer)
12266   window.setTimeout(function() { this.CreateCallbackCoreWithCustomArgs(arg, command, callbackID, customArgs); }.aspxBind(this), 0);
12267  else
12268   this.CreateCallbackCoreWithCustomArgs(arg, command, callbackID, customArgs);
12269  return callbackID;
12270 },
12271 CreateCallbackCoreWithCustomArgs: function(arg, command, callbackID, customArgs) {
12272  this.CreateCallbackCore(arg, command, callbackID);
12273 },
12274 GetCustomCallbackArgs: function() {
12275  return {};
12276 },
12277 CancelCallbackInternal: function() {
12278  this.CancelCallbackCore();
12279  this.HideLoadingElements();
12280 },
12281 CancelCallbackCore: function() {
12282 },
12283 CreateCallbackCore: function(arg, command, callbackID) {
12284  var callBackMethod = this.GetCallbackMethod(command);
12285  __theFormPostData = this.savedFormPostData;
12286  __theFormPostCollection = this.savedFormPostCollection;
12287  callBackMethod.call(this, this.GetSerializedCallbackInfoByID(callbackID) + arg);
12288 },
12289 GetCallbackMethod: function(command){
12290  return this.callBack;
12291 },
12292 CanCreateCallback: function() {
12293  return !this.InCallback() || (this.allowMultipleCallbacks && !this.beginCallbackA
12293nimationProcessing && !this.endCallbackAnimationProcessing);
12294 },
12295 DoLoadCallbackScripts: function() {
12296  ASPx.ProcessScriptsAndLinks(this.name, true);
12297 },
12298 DoEndCallback: function() {
12299  if(this.IsCallbackAnimationEnabled() && this.CheckEndCallbackAnimationNeeded()) 
12300   return;
12301  this.requestCount--;
12302  if (this.requestCount < 1) 
12303   this.callbackHandlersQueue.executeCallbacksHandlers();
12304  if(this.HideLoadingPanelOnCallback() && this.requestCount < 1) 
12305   this.HideLoadingElements();
12306  if(this.isSwipeGesturesEnabled() && this.supportGestures) {
12307   ASPx.GesturesHelper.UpdateSwipeAnimationContainer(this.name);
12308   if(this.touchUIMouseScroller)
12309    this.touchUIMouseScroller.update();
12310  }
12311  this.isCallbackAnimationPrevented = false;
12312  this.OnCallbackFinalized();
12313  this.AssignEllipsisTooltips();
12314  var command = this.GetCallbackCommand();
12315  this.RaiseEndCallback(command);
12316  this.InitializeIntersectionObserversManager();
12317  this.currentCallbackID = -1;
12318 },
12319 DoFinalizeCallback: function() {
12320 },
12321 OnCallbackFinalized: function() {
12322 },
12323 AssignEllipsisTooltips: function() { },
12324 GetCallbackCommand: function() {
12325  var result = "";
12326  if(this.currentCallbackID != -1) {
12327   var command = this.callbackCommand[this.currentCallbackID];
12328   if(command)
12329    result = command;
12330  }
12331  return result;
12332 },
12333 HideLoadingPanelOnCallback: function() {
12334  return true;
12335 },
12336 ShouldHideExistingLoadingElements: function() {
12337  return true;
12338 },
12339 EvalCallbackResult: function(resultString) {
12340  return eval(resultString);
12341 },
12342 ParseJSProperties: function(resultObj) {
12343  if(resultObj.cp) {
12344   for(var name in resultObj.cp)
12345    if(resultObj.cp.hasOwnProperty(name)) {
12346     this[name] = resultObj.cp[name];
12347     if(this.aspNetCoreWrapperInstance)
12348      this.aspNetCoreWrapperInstance[name] = resultObj.cp[name]; 
12349    }
12350  }
12351 },
12352 DoCallback: function(result) {
12353  if(this.IsCallbackAnimationEnabled() && this.CheckBeginCallbackA
12353nimationInProgress(result))
12354   return;
12355  result = ASPx.Str.Trim(result);
12356  if(result instanceof ASPx.NetworkError || result.indexOf(ASPx.CallbackResultPrefix) != 0)
12357   this.ProcessCallbackGeneralError(result, false);
12358  else {
12359   var resultObj = null;
12360   try {
12361    resultObj = this.EvalCallbackResult(result);
12362   } 
12363   catch(e) {
12364   }
12365   if(resultObj) {
12366    this.currentCallbackID = resultObj.id;
12367    ASPx.CacheHelper.DropCache(this);
12368    if(resultObj.redirect) {
12369     this.ParseJSProperties(resultObj); 
12370     ASPx.Url.Redirect(resultObj.redirect);
12371    }
12372    else if(ASPx.IsExists(resultObj.generalError)) {
12373     this.ProcessCallbackGeneralError(resultObj.generalError, true);
12374    }
12375    else {
12376     var errorObj = resultObj.error;
12377     if(errorObj) { 
12378      if(this.parseJSPropertiesOnCallbackError)
12379       this.ParseJSProperties(resultObj);
12380      this.ProcessCallbackError(errorObj,resultObj.id);
12381     } else {
12382      this.ParseJSProperties(resultObj);
12383      var callbackInfo = this.DequeueCallbackInfo(resultObj.id);
12384      if(callbackInfo && callbackInfo.type == ASPx.CallbackType.Data)
12385       this.ProcessCustomDataCallback(resultObj.result, callbackInfo);
12386      else {
12387       if (this.useCallbackQueue() && this.callbackQueueHelper.getCallbackInfoById(resultObj.id))
12388        this.callbackQueueHelper.processCallback(resultObj.result, resultObj.id);
12389       else {
12390        this.ProcessCallback(resultObj.result, resultObj.id);
12391        if(callbackInfo && callbackInfo.handler) {
12392         var handlerInfo = { handler: callbackInfo.handler, result: resultObj.result.data };
12393         this.callbackHandlersQueue.addCallbackHandler(handlerInfo);
12394        }
12395       }
12396      }
12397     }
12398    }
12399   }
12400  }
12401  this.DoLoadCallbackScripts();
12402 },
12403 DoCallbackError: function(result) {
12404  this.HideLoadingElements();
12405  this.ProcessCallbackGeneralError(result, false); 
12406 },
12407 DoControlClick: function(evt) {
12408  this.OnControlClick(ASPx.Evt.GetEventSource(evt), evt);
12409 },
12410 ProcessCallback: function (result, callbackId) {
12411  this.OnCallback(result, callbackId);
12412 },
12413 ProcessCustomDataCallback: function(result, callbackInfo) {
12414  if(callbackInfo.handler != null)
12415   callbackInfo.handler(this, result);
12416  this.RaiseCustomDataCallback(result);
12417 },
12418 RaiseCustomDataCallback: function(result) {
12419  if(!this.CustomDataCallback.IsEmpty()) {
12420   var arg = new ASPxClientCustomDataCallbackEventArgs(result);
12421   this.CustomDataCallback.FireEvent(this, arg);
12422  }
12423 },
12424 OnCallback: function(result) {
12425 },
12426 CreateCallbackInfo: function(type, handler) {
12427  return { type: type, handler: handler };
12428 },
12429 GetSerializedCallbackInfoByID: function(callbackID) {
12430  return this.GetCallbackInfoByID(callbackID).type + callbackID + ASPx.CallbackSeparator;
12431 },
12432 SaveCallbackInfo: function(info, command) {
12433  var callbacks = this.GetActiveCallbacksInfo();
12434  var index = callbacks.indexOf(null);
12435  if(index === -1)
12436   index = callbacks.length;
12437  callbacks[index] = info;
12438  this.callbackCommand[index] = command;
12439  return index;
12440 },
12441 GetActiveCallbacksInfo: function() {
12442  var persistentProperties = this.GetPersistentProperties();
12443  if(!persistentProperties.activeCallbacks)
12444   persistentProperties.activeCallbacks = [ ];
12445  return persistentProperties.activeCallbacks;
12446 },
12447 GetPersistentProperties: function() {
12448  var storage = _aspxGetPersistentControlPropertiesStorage();
12449  var persistentProperties = storage[this.name];
12450  if(!persistentProperties) {
12451   persistentProperties = { };
12452   storage[this.name] = persistentProperties;
12453  }
12454  return persistentProperties;
12455 },
12456 GetCallbackInfoByID: function(callbackID) {
12457  return this.GetActiveCallbacksInfo()[callbackID];
12458 },
12459 DequeueCallbackInfo: function(index) {
12460  var activeCallbacksInfo = this.GetActiveCallbacksInfo();
12461  if(index < 0 || index >= activeCallbacksInfo.length)
12462   return null;
12463  var result = activeCallbacksInfo[index];
12464  activeCallbacksInfo[index] = null;
12465  return result;
12466 },
12467 ProcessCallbackError: function (errorObj, callbackId) {
12468  var data = ASPx.IsExists(errorObj.data) ? errorObj.data : null;
12469  var result = this.RaiseCallbackError(errorObj.message, callbackId);
12470  if(result.isHandled)
12471   this.OnCallbackErrorAfterUserHandle(result.errorMessage, data); 
12472  else
12473   this.OnCallbackError(result.errorMessage, data); 
12474 },
12475 OnCallbackError: function(errorMessage, data) {
12476  if(errorMessage)
12477   ASPx.ShowErrorAlert(errorMessage);
12478 },
12479 OnCallbackErrorAfterUserHandle: function(errorMessage, data) {
12480 },
12481 ProcessCallbackGeneralError: function(error, serverExceptionOnLastCallback) {
12482  this.serverExceptionOnLastCallback = serverExceptionOnLastCallback;
12483  var isNetworkError = error instanceof ASPx.NetworkError;
12484  var errorMessage = isNetworkError ? error.message : error;
12485  var result = this.RaiseCallbackError(errorMessage);
12486  if(result.isHandled)
12487   this.OnCallbackGeneralErrorAfterUserHandle(result.errorMessage);
12488  else if(isNetworkError)
12489   this.OnCallbackNetworkError(result.errorMessage);
12490  else
12491   this.OnCallbackGeneralError(result.errorMessage);
12492 },
12493 OnCallbackGeneralError: function(errorMessage) {
12494  this.OnCallbackError(errorMessage, null);
12495 },
12496 OnCallbackNetworkError: function(errorMessage) {
12497  console.error(errorMessage);
12498 },
12499 OnCallbackGeneralErrorAfterUserHandle: function (errorMessage) {
12500 },
12501 SendPostBack: function(params, preventConvertToUpdatePanelCallback) {
12502  if(preventConvertToUpdatePanelCallback)
12503   this.sendMSAjaxCompatPostBack(params);
12504  else
12505   this.sendPostBackInternal(params);
12506 },
12507 sendPostBackInternal: function(params) {
12508  if(typeof(__doPostBack) != "undefined")
12509   __doPostBack(this.uniqueID, params);
12510  else{
12511   var form = this.GetParentForm();
12512   if(form) form.submit();
12513  }
12514 },
12515 sendMSAjaxCompatPostBack: function(params) {
12516  var rm = ASPx.GetMSAjaxRequestManager();
12517  var triggers = rm ? rm._postBackControlClientIDs : null;
12518  var needRegister = triggers && ASPx.Ident.IsArray(triggers) && ASPx.Data.ArrayIndexOf(triggers, this.name) == -1;
12519  if(needRegister)
12520   triggers.unshift(this.name);
12521  this.sendPostBackInternal(params);
12522  if(needRegister)
12523   triggers.shift();
12524 },
12525 IsValidInstance: function () {
12526  return aspxGetControlCollection().GetByName(this.name) === this;
12527 },
12528 OnDispose: function() { 
12529  this.RaiseDisposed();
12530  var varName = this.globalName;
12531  if(varName && varName !== "" && window && window[varName] && window[varName] == this){
12532   try{
12533    delete window[varName];
12534   }
12535   catch(e){  }
12536  }
12537  if(this.callbackQueueHelper)
12538   this.callbackQueueHelper.detachEvents();
12539  if (!this.IsDisposed())
12540   this.disposed = true;
12541 },
12542 OnGlobalControlsInitialized: function(args) { 
12543 },
12544 OnGlobalBrowserWindowResized: function(args) { 
12545 },
12546 OnGlobalBeginCallback: function(args) { 
12547 },
12548 OnGlobalEndCallback: function(args) { 
12549 },
12550 OnGlobalCallbackError: function(args) { 
12551 },
12552 OnGlobalValidationCompleted: function(args) { 
12553 },
12554 AddDefaultStateControllerItems: function() {
12555  var states = this.scStates;
12556  if(!states) return;
12557  var postfix = this.scPostfix ? ("_" + this.scPostfix) : "";
12558  var mainElementId = this.GetMainElementId();
12559  if(states & 2)
12560   this.AddDefaultReadOnlyStateControllerItem(this.scPrefix + "ReadOnly" + postfix, mainElementId);
12561  if(states & 4)
12562   this.AddDefaultDisabledStateControllerItem(this.scPrefix + "Disabled" + postfix, mainElementId);
12563 },
12564 AddDefaultReadOnlyStateControllerItem: function(cssClass, mainElementId) { throw "Not implemented"; },
12565 AddDefaultDisabledStateControllerItem: function(cssClass, mainElementId) { throw "Not implemented"; },
12566 DOMContentLoaded: function() { },
12567 IsStateControllerEnabled: function() { return false; },
12568 InitializeDOM: function() {
12569  var mainElement = this.GetMainElement();
12570  if(mainElement)
12571   ASPx.SetElementInitializedFlag(mainElement);
12572 },
12573 IsDOMInitialized: function() {
12574  var mainElement = this.GetMainElement();
12575  return mainElement && ASPx.GetElementInitializedFlag(mainElement);
12576 },
12577 AdjustControl: function(nestedCall) { },
12578 OnBrowserWindowResizeInternal: function(e) { },
12579 RegisterInControlTree: function(tree) { },
12580 InitializeIntersectionObserversManager: function () {
12581  var elementToObserve = this.getElementToObserveVisibilityChange();
12582  if(elementToObserve) {
12583   ASPx.IntersectionObserversManager.SubscribeElemensVisibilityChangeInBrowserWindow(elementToObserve, this.processVisibilityChanged.bind(this));
12584  }
12585 },
12586 getElementToObserveVisibilityChange: function () { },
12587 processVisibilityChanged: function (visible) { }
12588});
12589ASPxClientControlBase.Cast = function(obj) {
12590 if(typeof obj == "string")
12591  return window[obj];
12592 return obj;
12593};
12594var persistentControlPropertiesStorage = null;
12595function _aspxGetPersistentControlPropertiesStorage() {
12596 if(persistentControlPropertiesStorage == null)
12597  persistentControlPropertiesStorage = { };
12598 return persistentControlPropertiesStorage;
12599}
12600var ELLIPSIS_MARKER_CLASS = "dx-ellipsis";
12601var ELLIPSIS_TOOLTIP_MARKER_ATTR = "dxEllipsisTitle";
12602var ASPxClientControl = ASPx.CreateClass(ASPxClientControlBase, {
12603 constructor: function(name){
12604  this.constructor.prototype.constructor.call(this, name);
12605  this.rtl = false;
12606  this.enableEllipsis = false;
12607  this.isNative = false;
12608  this.isControlCollapsed = false;
12609  this.isInsideHierarchyAdjustment = false;
12610  this.controlOwner = null;
12611  this.adjustedSizes = { };
12612  this.dialogContentHashTable = { };
12613  this.renderIFrameForPopupElements = false;
12614  this.widthValueSetInPercentage = false;
12615  this.heightValueSetInPercentage = false;
12616  this.verticalAlignedElements = { };
12617  this.wrappedTextContainers = { };
12618  this.scrollPositionState = { };
12619  this.sizingConfig = {
12620   allowSetWidth: true,
12621   allowSetHeight: true,
12622   correction : false,
12623   adjustControl : false,
12624   supportPercentHeight: false,
12625   supportAutoHeight: false
12626  };
12627  this.percentSizeConfig = {
12628   width: -1,
12629   height: -1,
12630   markerWidth: -1,
12631   markerHeight: -1
12632  };  
12633 },
12634 querySelector: function(selector) { return this.querySelectorAll(selector)[0] || null; },
12635 querySelectorAll: function(selector) {
12636  return ASPx.CacheHelper.GetCachedElement(this, "querySelectorAll_" + selector,
12637   function() { return Array.prototype.slice.call(this.GetMainElement().querySelectorAll(selector)); });
12638 },
12639 createAccessKey: function (popupItem, getPopupElement, keyTipElement, key, onlyClick, manualStopProcessing) {
12640  return new ASPx.AccessKey(popupItem, getPopupElement, keyTipElement, key, onlyClick, manualStopProcessing);
12641 },
12642 InlineInitialize: function() {
12643  this.InitializeDOM();
12644  ASPxClientControlBase.prototype.InlineInitialize.call(this);
12645 },
12646 AfterCreate: function() { 
12647  ASPxClientControlBase.prototype.AfterCreate.call(this);
12648  if(!this.CanInitializeAdjustmentOnDOMContentLoaded() || ASPx.IsStartupScriptsRunning())
12649   this.InitializeAdjustment();
12650 },
12651 DOMContentLoaded: function() {
12652  if(this.CanInitializeAdjustmentOnDOMContentLoaded()) 
12653   this.InitializeAdjustment();
12654 },
12655 CanInitializeAdjustmentOnDOMContentLoaded: function() {
12656  return true;
12657 },
12658 InitializeAdjustment: function() {
12659  this.UpdateAdjustmentFlags();
12660  this.AdjustControl();
12661 },
12662 AfterInitialize: function() {
12663  this.AdjustControl();
12664  ASPxClientControlBase.prototype.AfterInitialize.call(this);
12665 },
12666 IsStateControllerEnabled: function(){
12667  return typeof(ASPx.GetStateController) != "undefined" && ASPx.GetStateController();
12668 },
12669 GetWidth: function() {
12670  return this.GetMainElement().offsetWidth;
12671 },
12672 GetHeight: function() {
12673  return this.GetMainElement().offsetHeight;
12674 },
12675 SetWidth: function(width) {
12676  if(this.sizingConfig.allowSetWidth)
12677   this.SetSizeCore("width", width, "GetWidth", false);
12678 },
12679 SetHeight: function(height) {
12680  if(this.sizingConfig.allowSetHeight)
12681   this.SetSizeCore("height", height, "GetHeight", false);
12682 },
12683 SetSizeCore: function(sizePropertyName, size, getFunctionName, corrected) {
12684  if(size < 0 || !this.GetMainElement())
12685   return;
12686  this.GetMainElement().style[sizePropertyName] = size + "px";
12687  this.UpdateAdjustmentFlags(sizePropertyName);
12688  if(this.sizingConfig.adjustControl)
12689   this.AdjustControl(true);
12690  if(this.sizingConfig.correction && !corrected) {
12691   var realSize = this[getFunctionName]();
12692   if(realSize != size) {
12693    var correctedSize = size - (realSize - size);
12694    this.SetSizeCore(sizePropertyName, correctedSize, getFunctionName, true);
12695   }
12696  }
12697 },
12698 AdjustControl: function(nestedCall) {
12699  if(this.IsAdjustmentRequired() && (!ASPxClientControl.adjustControlLocked || nestedCall)) {
12700   ASPxClientControl.adjustControlLocked = true;
12701   try {
12702    if(!this.IsAdjustmentAllowed())
12703     return;
12704    this.AdjustControlCore();
12705    this.UpdateAdjustedSizes();
12706   } 
12707   finally {
12708    delete ASPxClientControl.adjustControlLocked;
12709   }
12710  }
12711  this.AssignEllipsisTooltips();
12712  this.TryShowPhantomLoadingElements();
12713 },
12714 ResetControlAdjustment: function () {
12715  this.adjustedSizes = { };
12716 },
12717 UpdateAdjustmentFlags: function(sizeProperty) {
12718  var mainElement = this.GetMainElement();
12719  if(mainElement) {
12720   var mainElementStyle = ASPx.GetCurrentStyle(mainElement);
12721   this.UpdatePercentSizeConfig([mainElementStyle.width, mainElement.style.width], [mainElementStyle.height, mainElement.style.height], sizeProperty);
12722  }
12723 },
12724 UpdatePercentSizeConfig: function(widths, heights, modifyStyleProperty) {
12725  switch(modifyStyleProperty) {
12726   case "width":
12727    this.UpdatePercentWidthConfig(widths);
12728    break;
12729   case "height":
12730    this.UpdatePercentHeightConfig(heights);
12731    break;
12732   default:
12733    this.UpdatePercentWidthConfig(widths);
12734    this.UpdatePercentHeightConfig(heights);
12735    break;
12736  }
12737  this.ResetControlPercentMarkerSize();
12738 },
12739 UpdatePercentWidthConfig: function(widths) {
12740  this.widthValueSetInPercentage = false;
12741  for(var i = 0; i < widths.length; i++) {
12742   if(this.IsPercentageWidth(widths[i])) {
12743    this.percentSizeConfig.width = widths[i];
12744    this.widthValueSetInPercentage = true;
12745    break;
12746   }
12747  }
12748 },
12749 IsPercentageWidth: function(width) { return ASPx.IsPercentageSize(width); },
12750 UpdatePercentHeightConfig: function(heights) {
12751  this.heightValueSetInPercentage = false;
12752    for(var i = 0; i < heights.length; i++) {
12753   if(ASPx.IsPercentageSize(heights[i])) {
12754    this.percentSizeConfig.height = heights[i];
12755    this.heightValueSetInPercentage = true;
12756    break;
12757   }
12758  }
12759 },
12760 GetAdjustedSizes: function() {
12761  var mainElement = this.GetMainElement();
12762  if(mainElement) 
12763   return { width: mainElement.offsetWidth, height: mainElement.offsetHeight };
12764  return { width: 0, height: 0 };
12765 },
12766 IsAdjusted: function() {
12767  return (this.adjustedSizes.width && this.adjustedSizes.width > 0) && (this.adjustedSizes.height && this.adjustedSizes.height > 0);
12768 },
12769 IsAdjustmentRequired: function() {
12770  if(!this.IsAdjusted())
12771   return true;
12772  if(this.widthValueSetInPercentage)
12773   return true;
12774  if(this.heightValueSetInPercentage)
12775   return true;
12776  var sizes = this.GetAdjustedSizes();
12777  for(var name in sizes){
12778   if(this.adjustedSizes[name] !== sizes[name])
12779    return true;
12780  }
12781  return false;
12782 },
12783 IsAdjustmentAllowed: function() {
12784  var mainElement = this.GetMainElement();
12785  return mainElement && this.IsDisplayed() && !this.IsHidden() && this.IsDOMInitialized();
12786 },
12787 UpdateAdjustedSizes: function() {
12788  var sizes = this.GetAdjustedSizes();
12789  for(var name in sizes)
12790   if(sizes.hasOwnProperty(name))
12791    this.adjustedSizes[name] = sizes[name];
12792 },
12793 AdjustControlCore: function() {
12794 },
12795 AdjustAutoHeight: function() {
12796 },
12797 IsControlCollapsed: function() {
12798  return this.isControlCollapsed;
12799 },
12800 NeedCollapseControl: function() {
12801  return this.NeedCollapseControlCore() && this.IsAdjustmentRequired() && this.IsAdjustmentAllowed();
12802 },
12803 NeedCollapseControlCore: function() {
12804  return false;
12805 },
12806 CollapseEditor: function() {
12807 },
12808 CollapseControl: function() {
12809  this.SaveScrollPositions();
12810  var mainElement = this.GetMainElement(),
12811   marker = this.GetControlPercentSizeMarker();
12812  marker.style.height = this.heightValueSetInPercentage && this.sizingConfig.supp
12812ortPercentHeight
12813   ? this.percentSizeConfig.height 
12814   : (mainElement.offsetHeight + "px");
12815  mainElement.style.display = "none";
12816  this.isControlCollapsed = true;
12817 },
12818 ExpandControl: function() {
12819  var mainElement = this.GetMainElement();
12820  mainElement.style.display = "";
12821  this.GetControlPercentSizeMarker().style.height = "0px";
12822  this.isControlCollapsed = false;
12823  this.RestoreScrollPositions();
12824 },
12825 CanCauseReadjustment: function() {
12826  return this.NeedCollapseControlCore();
12827 },
12828 IsExpandableByAdjustment: function() {
12829  return false;
12830 },
12831 HasFixedPosition: function() {
12832  return false;
12833 },
12834 SaveScrollPositions: function() {
12835  var mainElement = this.GetMainElement();
12836  this.scrollPositionState.outer = ASPx.GetOuterScrollPosition(mainElement.parentNode);
12837  this.scrollPositionState.inner = ASPx.GetInnerScrollPositions(mainElement);
12838 },
12839 RestoreScrollPositions: function() {
12840  ASPx.RestoreOuterScrollPosition(this.scrollPositionState.outer);
12841  ASPx.RestoreInnerScrollPositions(this.scrollPositionState.inner);
12842 },
12843 GetControlPercentSizeMarker: function() {
12844  if(this.percentSizeMarker === undefined) {
12845   this.percentSizeMarker = ASPx.CreateHtmlElementFromString("<div style='height:0px;font-size:0px;line-height:0;width:100%;'></div>");
12846   ASPx.InsertElementAfter(this.percentSizeMarker, this.GetMainElement());
12847  }
12848  return this.percentSizeMarker;
12849 },
12850 KeepControlPercentSizeMarker: function(needCollapse, needCalculateHeight) {
12851  var marker = this.GetControlPercentSizeMarker(),
12852   markerHeight;
12853  if(needCollapse)
12854   this.CollapseControl();
12855  if(this.widthValueSetInPercentage && marker.style.width !== this.percentSizeConfig.width)
12856   marker.style.width = this.percentSizeConfig.width;
12857  if(needCalculateHeight) {
12858   if(this.IsControlCollapsed())
12859    markerHeight = marker.style.height;
12860   marker.style.height = this.percentSizeConfig.height;
12861  }
12862  this.percentSizeConfig.markerWidth = marker.offsetWidth;
12863  if(needCalculateHeight) {
12864   this.percentSizeConfig.markerHeight = marker.offsetHeight;
12865   if(this.IsControlCollapsed())
12866    marker.style.height = markerHeight;
12867   else
12868    marker.style.height = "0px";
12869  }
12870  if(needCollapse)
12871   this.ExpandControl();
12872 },
12873 ResetControlPercentMarkerSize: function() {
12874  this.percentSizeConfig.markerWidth = -1;
12875  this.percentSizeConfig.markerHeight = -1;
12876 },
12877 GetControlPercentMarkerSize: function(hideControl, force) {
12878  var needCalculateHeight = this.heightValueSetInPercentage && this.sizingConfig.supportPercentHeight;
12879  if(force || this.percentSizeConfig.markerWidth < 1 || (needCalculateHeight && this.percentSizeConfig.markerHeight < 1))
12880   this.KeepControlPercentSizeMarker(hideControl && !this.IsControlCollapsed(), needCalculateHeight);
12881  return {
12882   width: this.percentSizeConfig.markerWidth,
12883   height: this.percentSizeConfig.markerHeight
12884  };
12885 },
12886 AssignEllipsisTooltips: function() {
12887  if(this.RequireAssignTooltips())
12888   this.AssignEllipsisTooltipsCore();
12889 },
12890 AssignEllipsisTooltipsCore: function(rootElement, reassingExistingTooltips) {
12891  var requirePaddingManipulation = ASPx.Browser.Edge || ASPx.Browser.Firefox;
12892  rootElement = rootElement || this.GetMainElement();
12893  var nodes = this.GetEllipsisNodes(rootElement);
12894  var nodeInfos = [];
12895  var nodesCount = nodes.length;
12896  for(var i = 0; i < nodesCount; i++) {
12897   var node = nodes[i];
12898   var info = { node: node };
12899   if(requirePaddingManipulation) {
12900    var style = ASPx.GetCurrentStyle(node);
12901    info.paddingLeft = node.style.paddingLeft;
12902    info.totalPadding = ASPx.GetLeftRightPaddings(node, style);
12903   }
12904   nodeInfos.push(info);
12905  }
12906  if(requirePaddingManipulation) {
12907   for(var i = 0; i < nodesCount; i++) {
12908    var info = nodeInfos[i];
12909    ASPx.SetStyles(info.node, { paddingLeft: info.totalPadding }, true);
12910   }
12911  }
12912  for(var i = 0; i < nodesCount; i++) {
12913   var info = nodeInfos[i];
12914   var node = info.node;
12915   info.isTextShortened = node.scrollWidth > node.clientWidth;
12916   info.hasTitle = ASPx.Attr.GetAttribute(node, "title") !== null;
12917   if(!info.hasTitle || reassingExistingTooltips)
12918    info.title = ASPx.GetEllipsisTooltipText(node);
12919  }
12920  for(var i = 0; i < nodesCount; i++) {
12921   var info = nodeInfos[i];
12922   var node = info.node;
12923   if(info.isTextShortened && info.title) {
12924    ASPx.Attr.SetAttribute(node, "title", info.title);
12925    ASPx.Attr.SetAttribute(node, ELLIPSIS_TOOLTIP_MARKER_ATTR, true);
12926   }
12927   if(!info.isTextShortened && info.hasTitle)
12928    ASPx.Attr.RemoveAttribute(node, "title");
12929  }
12930  if(requirePaddingManipulation) {
12931   for(var i = 0; i < nodesCount; i++) {
12932    var info = nodeInfos[i];
12933    var node = info.node;
12934    node.style.paddingLeft = info.paddingLeft;
12935   }
12936  }
12937 },
12938 GetEllipsisNodes: function(element) {
12939  var ellipsibleNodes = ASPx.Data.CollectionToArray(ASPx.GetNodesByClassName(element, ELLIPSIS_MARKER_CLASS));
12940  if(ASPx.ElementHasCssClass(element, ELLIPSIS_MARKER_CLASS))
12941   ellipsibleNodes.push(element);
12942  return ellipsibleNodes.filter(function(node) {
12943   return !ASPx.Attr.IsExistsAttribute(node, "title") || ASPx.Attr.IsExistsAttribute(node, ELLIPSIS_TOOLTIP_MARKER_ATTR);
12944  });
12945 },
12946 RequireAssignTooltips: function() {
12947  return this.enableEllipsis && !ASPx.Browser.MobileUI;
12948 },
12949 RemoveEllipsisFromNode: function(node) {
12950  ASPx.RemoveClassNameFromElement(node, ELLIPSIS_MARKER_CLASS);
12951  this.RemoveEllipsisTooltip(node);
12952 },
12953 RemoveEllipsisTooltip: function(node) {
12954  if(ASPx.Attr.IsExistsAttribute(node, ELLIPSIS_TOOLTIP_MARKER_ATTR)) {
12955   ASPx.Attr.RemoveAttribute(node, "title");
12956   ASPx.Attr.RemoveAttribute(node, ELLIPSIS_TOOLTIP_MARKER_ATTR);
12957  }
12958 },
12959 OnBrowserWindowResize: function(e) {
12960 },
12961 OnBrowserWindowResizeInternal: function(e){
12962  if(this.BrowserWindowResizeSubscriber()) 
12963   this.OnBrowserWindowResize(e);
12964 },
12965 BrowserWindowResizeSubscriber: function() {
12966  return this.widthValueSetInPercentage || !this.IsAdjusted();
12967 },
12968 ShrinkWrappedText: function(getElements, key, reCorrect) {
12969  if(!ASPx.Browser.Safari) return;
12970  var elements = ASPx.CacheHelper.GetCachedElements(this, key, getElements, this.wrappedTextContainers);
12971  for(var i = 0; i < elements.length; i++)
12972   this.ShrinkWrappedTextInContainer(elements[i], reCorrect);
12973 },
12974 ShrinkWrappedTextInContainer: function(container, reCorrect) {
12975  if(!ASPx.Browser.Safari || !container || (container.dxWrappedTextShrinked && !reCorrect) || container.offsetWidth === 0) return;
12976  ASPx.ShrinkWrappedTextInContainer(container);
12977  container.dxWrappedTextShrinked = true;
12978 },
12979 CorrectWrappedText: function(getElements, key, reCorrect) {
12980  var elements = ASPx.CacheHelper.GetCachedElements(this, key, getElements, this.wrappedTextContainers);
12981  for(var i = 0; i < elements.length; i++)
12982   this.CorrectWrappedTextInContainer(elements[i], reCorrect);
12983 },
12984 CorrectWrappedTextInContainer: function(container, reCorrect) {
12985  if(!container || (container.dxWrappedTextCorrected && !reCorrect) || container.offsetWidth === 0) return;
12986  ASPx.AdjustWrappedTextInContainer(container);
12987  container.dxWrappedTextCorrected = true;
12988 },
12989 CorrectVerticalAlignment: function(alignMethod, getElements, key, reAlign) {
12990  var elements = ASPx.CacheHelper.GetCachedElements(this, key, getElements, this.verticalAlignedElements);
12991  for(var i = 0; i < elements.length; i++)
12992   this.CorrectElementVerticalAlignment(alignMethod, elements[i], reAlign);
12993 },
12994 CorrectElementVerticalAlignment: function(alignMethod, element, reAlign) {
12995  if(!element || (element.dxVerticalAligned && !reAlign) || element.offsetHeight === 0) return;
12996  alignMethod(element);
12997  element.dxVerticalAligned = true;
12998 },
12999 ClearVerticalAlignedElementsCache: function() {
13000  ASPx.CacheHelper.DropCache(this.verticalAlignedElements);
13001 },
13002 ClearWrappedTextContainersCache: function() {
13003  ASPx.CacheHelper.DropCache(this.wrappedTextContainers);
13004 },
13005 AdjustPagerControls: function() {
13006  if(typeof(ASPx.GetPagersCollection) != "undefined")
13007   ASPx.GetPagersCollection().AdjustControls(this.GetMainElement());
13008 },
13009 RegisterInControlTree: function(tree) {
13010  var mainElement = this.GetMainElement();
13011  if(mainElement && mainElement.id)
13012   tree.createNode(mainElement.id, this);
13013 },
13014 GetItemElementName: function(element) {
13015  var name = "";
13016  if(element.id)
13017   name = element.id.substring(this.name.length + 1);
13018  return name;
13019 },
13020 GetLinkElement: function(element) {
13021  if(element == null) return null;
13022  return (element.tagName == "A") ? element : ASPx.GetNodeByTagName(element, "A", 0);
13023 },
13024 GetInternalHyperlinkElement: function(parentElement, index) {
13025  var element = ASPx.GetNodeByTagName(parentElement, "A", index);
13026  if(element == null) 
13027   element = ASPx.GetNodeByTagName(parentElement, "SPAN", index);
13028  return element;
13029 },
13030 OnControlClick: function(clickedElement, htmlEvent) {
13031 }
13032});
13033ASPxClientControl.Cast = function(obj) {
13034 if(typeof obj == "string")
13035  return window[obj];
13036 return obj;
13037};
13038ASPxClientControl.AdjustControls = function(container, collapseControls){
13039 aspxGetControlCollection().AdjustControls(container, collapseControls);
13040};
13041ASPxClientControl.GetControlCollection = function(){
13042 return aspxGetControlCollection();
13043};
13044ASPxClientControl.LeadingAfterInitCallConsts = {
13045 None: 0,
13046 Direct: 1,
13047 Reverse: 2
13048};
13049var ASPxClientComponent = ASPx.CreateClass(ASPxClientControl, {
13050 constructor: function (name) {
13051  this.constructor.prototype.constructor.call(this, name);
13052 },
13053 IsDOMDisposed: function() { 
13054  return false;
13055 }
13056});
13057var ASPxClientControlCollection = ASPx.CreateClass(ASPx.CollectionBase, {
13058 constructor: function(){
13059  this.constructor.prototype.constructor.call(this);
13060  this.prevWndWidth = "";
13061  this.prevWndHeight = "";
13062  this.requestCountInternal = 0; 
13063  this.BeforeInitCallback = new ASPxClientEvent();
13064  this.ControlsInitialized = new ASPxClientEvent();
13065  this.BrowserWindowResized = new ASPxClientEvent();
13066  this.BrowserWindowResizedInternal = new ASPxClientEvent();
13067  this.BeginCallback = new ASPxClientEvent();
13068  this.EndCallback = new ASPxClientEvent();
13069  this.CallbackError = new ASPxClientEvent();
13070  this.ValidationCompleted = new ASPxClientEvent();
13071  aspxGetControlCollectionCollection().Add(this);
13072 },
13073 Add: function(element) {
13074  var existsElement = this.Get(element.name);
13075  if(existsElement && existsElement !== element) 
13076   this.Remove(existsElement);
13077  ASPx.CollectionBase.prototype.Add.call(this, element.name, element);
13078 },
13079 Remove: function(element) {
13080  if(element && element instanceof ASPxClientControl && !element.IsDisposed())
13081   element.OnDispose();
13082  ASPx.CollectionBase.prototype.Remove.call(this, element.name);
13083 },
13084 GetGlobal: function(name) {
13085  var result = window[name];
13086  return result && Ident.IsASPxClientControl(result)
13087   ? result
13088   : null;
13089 },
13090 GetByName: function(name){
13091  return this.Get(name) || this.GetGlobal(name);
13092 },
13093 GetCollectionType: function(){
13094  return ASPxClientControlCollection.BaseCollectionType;
13095 },
13096 GetControlsByPredicate: function(predicate) {
13097  var result = [];
13098  this.ForEachControl(function(control) {
13099   if(!predicate || predicate(control))
13100    result.push(control);
13101  });
13102  return result;
13103 },
13104 GetControlsByType: function(type) {
13105  return this.GetControlsByPredicate(function(control) { 
13106   return type && (control instanceof type);
13107  });
13108 },
13109 ForEachControl: function(action, context) {
13110  context = context || this;
13111  this.elementsMap.forEachEntry(function(name, control) {
13112   if(Ident.IsASPxClientControl(control) && (!this.filterPredicate || this.filterPredicate(control)))
13113    return action.call(context, control);
13114  }, context);
13115 },
13116 ProcessActionByPredicate: function(action, predicate) {
13117  try {
13118   this.filterPredicate = predicate;
13119   action(this);
13120  }
13121  finally {
13122   this.filterPredicate = null;
13123  }
13124 },
13125 adjustControlsInternal: function(container, context, collapseControls, adjustFunc) {
13126  context = context || this;
13127  var func = function(control) {
13128   adjustFunc.call(context, control);
13129  };
13130  ASPx.GetControlAdjuster().adjustControlsInHierarchy(this, func, container, collapseControls);
13131 },
13132 AdjustControls: function(container, collapseControls) {
13133  container = container || null;
13134  window.setTimeout(function() {
13135   this.AdjustControlsCore(container, collapseControls);
13136  }.aspxBind(this), 0);
13137 },
13138 AdjustControlsCore: function(container, collapseControls) {
13139  var adjustFunction = function(control) { control.AdjustControl(); };
13140  this.adjustControlsInternal(container, this, collapseControls, adjustFunction);
13141 },
13142 CollapseControls: function(container) {
13143  this.ProcessControlsInContainer(container, function(control) {
13144   if(control.isASPxClientEdit)
13145    control.CollapseEditor();
13146   else if(!!window.ASPxClientRibbon && control instanceof ASPxClientRibbon)
13147    control.CollapseControl();
13148  });
13149 },
13150 AtlasInitialize: function(isCallback) {
13151  this.ForEachControl(function(control) {
13152   control.AtlasPreInitialize();
13153  });
13154  ASPx.ProcessScriptsAndLinks("", isCallback);
13155  this.ForEachControl(function(control) {
13156   control.AtlasInitialize();
13157  });
13158 },
13159 DOMContentLoaded: function() {
13160  this.ForEachControl(function(control){
13161    control.DOMContentLoaded();
13162  });
13163 },
13164 OnDocumentUnload: function() {
13165  this.ForEachControl(function(control) {
13166   control.RaiseUnload();
13167  });
13168 },
13169 Initialize: function() {
13170  ASPx.GetPostHandler().Post.AddHandler(
13171   function(s, e) { this.OnPost(e); }.aspxBind(this)
13172  );
13173  ASPx.GetPostHandler().PostFinalization.AddHandler(
13174   function(s, e) { this.OnPostFinalization(e); }.aspxBind(this)
13175  );
13176  this.InitializeElements(false );
13177  if(typeof(Sys) != "undefined" && typeof(Sys.Application) != "undefined") {
13178   var checkIsInitialized = function() {
13179    if(Sys.Application.get_isInitialized())
13180     Sys.Application.add_load(aspxCAInit);
13181    else
13182     setTimeout(checkIsInitialized, 0);
13183   };
13184   checkIsInitialized();
13185  }
13186  this.InitWindowSizeCache();
13187 },
13188 FinalizeInitialization: function() {
13189  this.ForEachControl(function(control) {
13190   control.FinalizeInitialization();
13191  });
13192 },
13193 InitializeElements: function(isCallback) {
13194  this.ForEachControl(function(control){
13195   if(!control.isInitialized)
13196    control.Initialize();
13197  });
13198  this.AfterInitializeElementsLeadingCall();
13199  this.AfterInitializeElements();
13200  this.RaiseControlsInitialized(isCallback);
13201 },
13202 AfterInitializeElementsLeadingCall: function() {
13203  var controls = {};
13204  controls[ASPxClientControl.LeadingAfterInitCallConsts.Direct] = [];
13205  controls[ASPxClientControl.LeadingAfterInitCallConsts.Reverse] = [];
13206  this.ForEachControl(function(control) {
13207   if(control.leadingAfterInitCall != ASPxClientControl.LeadingAfterInitCallConsts.None && !control.isInitialized)
13208    controls[control.leadingAfterInitCall].push(control);
13209  });
13210  var directInitControls = controls[ASPxClientControl.LeadingAfterInitCallConsts.Direct],
13211   reverseInitControls = controls[ASPxClientControl.LeadingAfterInitCallConsts.Reverse];
13212  for(var i = 0, control; control = directInitControls[i]; i++)
13213   control.AfterInitialize();
13214  for(var i = reverseInitControls.length - 1, control; control = reverseInitControls[i]; i--)
13215   control.AfterInitialize();
13216 },
13217 AfterInitializeElements: function() {
13218  this.ForEachControl(function(control) {
13219   if(control.leadingAfterInitCall == ASPxClientControl.LeadingAfterInitCallConsts.None && !control.isInitialized)
13220    control.AfterInitialize();
13221  });
13222  ASPx.RippleHelper.Init();
13223 },
13224 DoFinalizeCallback: function() {
13225  this.ForEachControl(function(control){
13226   control.DoFinalizeCallback();
13227  });
13228 },
13229 ProcessControlsInContainer: function(container, processFunc, filterFunc) {
13230  this.ForEachControl(function(control){
13231   if((!filterFunc || filterFunc(control)) && (!container || this.IsControlInContainer(container, control)))
13232    processFunc(control);
13233  });
13234 },
13235 IsControlInContainer: function(container, control) {
13236  if(control.GetMainElement) {
13237   var mainElement = control.GetMainElement();
13238   if(mainElement && (mainElement != container)) {
13239    if(ASPx.GetIsParent(container, mainElement))
13240     return true;
13241   }
13242  }
13243  return false;
13244 },
13245 RaiseControlsInitialized: function(isCallback) {
13246  if(typeof(isCallback) == "undefined")
13247   isCallback = true;
13248  var args = new ASPxClientControlsInitializedEventArgs(isCallback);
13249  if(!this.ControlsInitialized.IsEmpty())  
13250   this.ControlsInitialized.FireEvent(this, args);
13251  this.ForEachControl(function(control){
13252   control.OnGlobalControlsInitialized(args);
13253  });
13254 },
13255 RaiseBrowserWindowResized: function() {
13256  var args = new ASPxClientEventArgs();
13257  if(!this.BrowserWindowResized.IsEmpty())
13258   this.BrowserWindowResized.FireEvent(this, args);
13259  this.ForEachControl(function(control){
13260   control.OnGlobalBrowserWindowResized(args);
13261  });
13262 },
13263 RaiseBrowserWindowResizedInternal: function(eventInfo) {
13264  var args = new ASPxClientBrowserWindowResizedInternalEventArgs(eventInfo);
13265  if(!this.BrowserWindowResizedInternal.IsEmpty())
13266   this.BrowserWindowResizedInternal.FireEvent(this, args);
13267 },
13268 RaiseBeginCallback: function (control, command) {
13269  var args = new ASPxClientGlobalBeginCallbackEventArgs(control, command);
13270  if(!this.BeginCallback.IsEmpty())
13271   this.BeginCallback.FireEvent(this, args);
13272  this.ForEachControl(function(control){
13273   control.OnGlobalBeginCallback(args);
13274  });
13275  this.IncrementRequestCount();
13276 },
13277 RaiseEndCallback: function (control) {
13278  var args = new ASPxClientGlobalEndCallbackEventArgs(control);
13279  if (!this.EndCallback.IsEmpty()) 
13280   this.EndCallback.FireEvent(this, args);
13281  this.ForEachControl(function(control){
13282   control.OnGlobalEndCallback(args);
13283  });
13284  this.DecrementRequestCount();
13285 },
13286 InCallback: function() {
13287  return this.requestCountInternal > 0;
13288 },
13289 RaiseCallbackError: function (control, message, callbackId) {
13290  var args = new ASPxClientGlobalCallbackErrorEventArgs(control, message, callbackId);
13291  if (!this.CallbackError.IsEmpty()) 
13292   this.CallbackError.FireEvent(this, args);
13293  this.ForEachControl(function(control){
13294   control.OnGlobalCallbackError(args);
13295  });
13296  if(args.handled)
13297   return { isHandled: true, errorMessage: args.message };  
13298  return { isHandled: false, errorMessage: message };
13299 },
13300 RaiseValidationCompleted: function (container, validationGroup, invisibleControlsValidated, isValid, firstInvalidControl, firstVisibleInvalidControl) {
13301  var args = new ASPxClientValidationCompletedEventArgs(container, validationGroup, invisibleControlsValidated, isValid, firstInvalidControl, firstVisibleInvalidControl);
13302  if (!this.ValidationCompleted.IsEmpty()) 
13303   this.ValidationCompleted.FireEvent(this, args);
13304  this.ForEachControl(function(control){
13305   control.OnGlobalValidationCompleted(args);
13306  });
13307  return args.isValid;
13308 },
13309 Before_WebForm_InitCallback: function(callbackOwnerID){
13310  var args = new BeforeInitCallbackEventArgs(callbackOwnerID);
13311  this.BeforeInitCallback.FireEvent(this, args);
13312 },
13313 InitWindowSizeCache: function(){
13314  this.prevWndWidth = ASPx.GetDocumentClientWidth();
13315  this.prevWndHeight = ASPx.GetDocumentClientHeight();
13316 },
13317 OnBrowserWindowResize: function(evt){
13318  this.OnBrowserWindowResizeCore(evt);
13319 },
13320 OnBrowserWindowResizeCore: function(htmlEvent){
13321  var args = this.CreateOnBrowserWindowResizeEventArgs(htmlEvent);
13322  if(this.CalculateIsBrowserWindowSizeChanged()) {
13323   this.RaiseBrowserWindowResizedInternal(args);
13324   this.adjustControlsInternal(null, this, true, function(control) {
13325    if(control.IsDOMInitialized())
13326     control.OnBrowserWindowResizeInternal(args);
13327   });
13328   this.RaiseBrowserWindowResized();
13329  }
13330 },
13331 CreateOnBrowserWindowResizeEventArgs: function(htmlEvent) {
13332  return {
13333   htmlEvent: htmlEvent,
13334   wndWidth: ASPx.GetDocumentClientWidth(),
13335   wndHeight: ASPx.GetDocumentClientHeight(),
13336   prevWndWidth: this.prevWndWidth,
13337   prevWndHeight: this.prevWndHeight,
13338   virtualKeyboardShownOnAndroid: this.IsVirtualKeyboardShownOnAndroid()
13339  };
13340 },
13341 IsVirtualKeyboardShownOnAndroid: function() {
13342  if(!ASPx.Browser.AndroidMobilePlatform)
13343   return false;
13344  var documentClientWidth = ASPx.GetDocumentClientWidth();
13345  var documentClientHeight = ASPx.GetDocumentClientHeight();
13346  var isDocumentClientHeightChangedOnly = documentClientWidth === this.prevWndWidth && documentClientHeight !== this.prevWndHeight;
13347  return isDocumentClientHeightChangedOnly && this.IsElementSupportKeyboardInput(document.activeElement);
13348 },
13349 IsElementSupportKeyboardInput: function(element) {
13350  if(!element || !element.tagName)
13351   return false;
13352  var supportedKeyboardInputTagNames = ["INPUT", "TEXTAREA"];
13353  return supportedKeyboardInputTagNames.indexOf(element.tagName) !== -1;
13354 },
13355 CalculateIsBrowserWindowSizeChanged: function(){
13356  var wndWidth = ASPx.GetDocumentClientWidth();
13357  var wndHeight = ASPx.GetDocumentClientHeight();
13358  var isBrowserWindowSizeChanged = (this.prevWndWidth != wndWidth) || (this.prevWndHeight != wndHeight);
13359  if(isBrowserWindowSizeChanged){
13360   this.prevWndWidth = wndWidth;
13361   this.prevWndHeight = wndHeight;
13362   return true;
13363  }
13364  return false;
13365 },
13366 OnPost: function(args){
13367  this.ForEachControl(function(control) {
13368   control.OnPost(args);
13369  }, null);
13370 },
13371 OnPostFinalization: function(args){
13372  this.ForEachControl(function(control) {
13373   control.OnPostFinalization(args);
13374  }, null);
13375 },
13376 IncrementRequestCount: function() {
13377  this.requestCountInternal++;
13378 },
13379 DecrementRequestCount: function() {
13380  this.requestCountInternal--;
13381 },
13382 ResetRequestCount: function() {
13383  this.requestCountInternal = 0;
13384 }
13385});
13386ASPxClientControlCollection.BaseCollectionType = "Control";
13387var controlCollection = null;
13388function aspxGetControlCollection(){
13389 if(controlCollection == null) {
13390  controlCollection = new ASPxClientControlCollection();
13391  if(ASPx.loadControlCollectionPreloadHandlers)
13392   ASPx.loadControlCollectionPreloadHandlers(controlCollection);
13393 }
13394 return controlCollection;
13395}
13396var ControlCollectionCollection = ASPx.CreateClass(ASPx.CollectionBase, {
13397 constructor: function(){
13398  this.constructor.prototype.constructor.call(this);
13399 },
13400 Add: function(element) {
13401  var key = element.GetCollectionType();
13402  if(!key) throw "The collection type isn't specified.";
13403  if(this.Get(key)) throw "The collection with type='" + key + "' already exists.";
13404  ASPx.CollectionBase.prototype.Add.call(this, key, element);
13405 },
13406 RemoveDisposedControls: function(){
13407  var baseCollection = this.Get(ASPxClientControlCollection.BaseCollectionType);
13408  var disposedControls = [];
13409  baseCollection.elementsMap.forEachEntry(function(name, control) {
13410   if(!ASPx.Ident.IsASPxClientControl(control)) return;
13411   if(control.IsDOMDisposed())
13412    disposedControls.push(control);
13413  });
13414  this.RemoveControls(disposedControls);
13415 },
13416 RemoveControls: function(controls){
13417  for(var i = 0; i < controls.length; i++) {
13418   this.elementsMap.forEachEntry(function(key, collection) {
13419    if(ASPx.Ident.IsASPxClientCollection(collection))
13420     collection.Remove(controls[i]);
13421   });
13422  }
13423 }
13424});
13425var controlCollectionCollection = null;
13426function aspxGetControlCollectionCollection(){
13427 if(controlCollectionCollection == null)
13428  controlCollectionCollection = new ControlCollectionCollection();
13429 return controlCollectionCollection;
13430}
13431var AriaDescriptionAttributes = {
13432 Role: "0",
13433 AriaLabel: "1",
13434 TabIndex: "2",
13435 AriaOwns: "3",
13436 AriaDescribedBy: "4",
13437 AriaDisabled: "5",
13438 AriaHasPopup: "6",
13439 AriaLevel: "7"
13440};
13441var AriaDescriptor = ASPx.CreateClass(null, {
13442 constructor: function(ownerControl, description) {
13443  this.ownerControl = ownerControl;
13444  this.rootElement = ownerControl.GetMainElement();
13445  this.description = description;
13446 },
13447 setDescription: function(name, argList) {
13448  var description = this.findChildDescription(name);
13449  if(description) {
13450   var elements = name ? this.rootElement.querySelectorAll(this.getDescriptionSelector(description)) : [this.rootElement];
13451   for(var i = 0; i < elements.length; i++)
13452    this.applyDescriptionToElement(elements[i], description, argList[i] || argList[0]);
13453  }
13454 },
13455 getDescriptionName: function(description) {
13456  return description.n;
13457 },
13458 getDescriptionSelector: function(description) {
13459  return description.s;
13460 },
13461 findChildDescription: function(name) {
13462  if(name === this.getDescriptionName(this.description))
13463   return this.description;
13464  var childCollection = this.description.c || [];
13465  for(var i = 0; i < childCollection.length; i++) {
13466   var childDescription = childCollection[i];
13467   if(this.getDescriptionName(childDescription) === name)
13468    return childDescription;
13469  }
13470  return null;
13471 },
13472 applyDescriptionToElement: function(element, description, args) {
13473  if(!description || !element)
13474   return;
13475  this.trySetAriaOwnsAttribute(element, description);
13476  this.trySetAriaDescribedByAttribute(element, description);
13477  this.trySetAttribute(element, description, AriaDescriptionAttributes.Role, "role");
13478  this.trySetAttribute(element, description, AriaDescriptionAttributes.TabIndex, "tabindex");
13479  this.trySetAttribute(element, description, AriaDescriptionAttributes.AriaLevel, "aria-level");
13480  this.executeOnDescription(description, AriaDescriptionAttributes.AriaLabel, function(value) {
13481   ASPx.Attr.SetAttribute(element, "aria-label", ASPx.Str.ApplyReplacement(value, args
13481));
13482  });
13483  this.executeOnDescription(description, AriaDescriptionAttributes.AriaDisabled, function(value) {
13484   ASPx.Attr.SetAttribute(element, "aria-disabled", !!value); 
13485  });
13486  this.executeOnDescription(description, AriaDescriptionAttributes.AriaHasPopup, function(value) {
13487   ASPx.Attr.SetAttribute(element, "aria-haspopup", !!value);
13488  });
13489 },
13490 trySetAriaDescribedByAttribute: function(element, description) {
13491  this.executeOnDescription(description, AriaDescriptionAttributes.AriaDescribedBy, function(selectorInfo) {
13492   var descriptor = this.getNodesBySelector(element, selectorInfo.descriptorSelector)[0];
13493   var target = this.getNodesBySelector(element, selectorInfo.targetSelector)[0];
13494   if(!target || !descriptor)
13495    return;
13496   ASPx.Attr.SetAttribute(target, "aria-describedby", this.getNodeId(descriptor));
13497  });
13498 },
13499 trySetAriaOwnsAttribute: function(element, description) {
13500  this.executeOnDescription(description, AriaDescriptionAttributes.AriaOwns, function(selector) {
13501   var ownedNodes = this.getNodesBySelector(element, selector);
13502   var ariaOwnsAttributeValue = "";
13503   for(var i = 0; i < ownedNodes.length; i++)
13504    ariaOwnsAttributeValue += (this.getNodeId(ownedNodes[i]) + (i != ownedNodes.length - 1 ? " " : ""));
13505   ASPx.Attr.SetAttribute(element, "aria-owns", ariaOwnsAttributeValue);
13506  });
13507 },
13508 trySetAttribute: function(element, description, ariaAttribute, attributeName) {
13509  this.executeOnDescription(description, ariaAttribute, function(value) { 
13510   ASPx.Attr.SetAttribute(element, attributeName, description[ariaAttribute]); 
13511  });
13512 },
13513 executeOnDescription: function(description, ariaDescAttr, callback) {
13514  var descInfo = description[ariaDescAttr];
13515  if(ASPx.IsExists(descInfo))
13516   callback.aspxBind(this)(descInfo);
13517 },
13518 getNodesBySelector: function(element, selector) {
13519  var id = element.id || "";
13520  var childNodes = element.querySelectorAll("#" + this.getNodeId(element) + " > " + selector);
13521  ASPx.Attr.SetOrRemoveAttribute(element, "id", id);
13522  return childNodes;
13523 },
13524 getNodeId: function(node) {
13525  if(!node.id)
13526   node.id = this.createRandomId();
13527  return node.id; 
13528 },
13529 createRandomId: function() {
13530  return "r" + ASPx.CreateGuid();
13531 }
13532});
13533PagerCommands = {
13534 Next : "PBN",
13535 Prev : "PBP",
13536 Last : "PBL",
13537 First : "PBF",
13538 PageNumber : "PN",
13539 PageSize : "PSP"
13540};
13541ASPx.callbackProcessed = false;
13542ASPx.Callback = function(result, context){ 
13543 var collection = aspxGetControlCollection();
13544 collection.DoFinalizeCallback();
13545 var control = collection.Get(context);
13546 if(control != null)
13547  control.DoCallback(result);
13548 ASPx.RippleHelper.ReInit();
13549 ASPx.callbackProcessed = true;
13550};
13551ASPx.CallbackError = function(result, context){
13552 var control = aspxGetControlCollection().Get(context);
13553 if(control != null)
13554  control.DoCallbackError(result, false);
13555 ASPx.callbackProcessed = true;
13556};
13557ASPx.CClick = function(name, evt) {
13558 var control = aspxGetControlCollection().Get(name);
13559 if(control != null) control.DoControlClick(evt);
13560};
13561function aspxCAInit() {
13562 var isAppInit = typeof(Sys$_Application$initialize) != "undefined" &&
13563  ASPx.FunctionIsInCallstack(arguments.callee, Sys$_Application$initialize, 10 );
13564 aspxGetControlCollection().AtlasInitialize(!isAppInit);
13565}
13566ASPx.Evt.AttachEventToElement(window, "resize", aspxGlobalWindowResize);
13567function aspxGlobalWindowResize(evt){
13568 aspxGetControlCollection().OnBrowserWindowResize(evt); 
13569}
13570ASPx.Evt.AttachEventToElement(window, "unload", aspxClassesUnload);
13571function aspxClassesUnload(evt) {
13572 aspxGetControlCollection().OnDocumentUnload();
13573}
13574ASPx.attachToLoad(aspxClassesDOMContentLoaded);
13575function aspxClassesDOMContentLoaded(evt){
13576 aspxGetControlCollection().DOMContentLoaded();
13577}
13578ASPx.GetControlCollection = aspxGetControlCollection;
13579ASPx.GetControlCollectionCollection = aspxGetControlCollectionCollection;
13580ASPx.GetPersistentControlPropertiesStorage = _aspxGetPersistentControlPropertiesStorage;
13581ASPx.PagerCommands = PagerCommands;
13582ASPx.ELLIPSIS_MARKER_CLASS = ELLIPSIS_MARKER_CLASS;
13583window.ASPxClientBeginCallbackEventArgs = ASPxClientBeginCallbackEventArgs;
13584window.ASPxClientGlobalBeginCallbackEventArgs = ASPxClientGlobalBeginCallbackEventArgs;
13585window.ASPxClientEndCallbackEventArgs = ASPxClientEndCallbackEventArgs;
13586window.ASPxClientGlobalEndCallbackEventArgs = ASPxClientGlobalEndCallbackEventArgs;
13587window.ASPxClientCallbackErrorEventArgs = ASPxClientCallbackErrorEventArgs;
13588window.ASPxClientGlobalCallbackErrorEventArgs = ASPxClientGlobalCallbackErrorEventArgs;
13589window.ASPxClientCustomDataCallbackEventArgs = ASPxClientCustomDataCallbackEventArgs;
13590window.ASPxClientValidationCompletedEventArgs = ASPxClientValidationCompletedEventArgs;
13591window.ASPxClientControlsInitializedEventArgs = ASPxClientControlsInitializedEventArgs;
13592window.ASPxClientControlBeforePronounceEventArgs = ASPxClientControlBeforePronounceEventArgs;
13593window.ASPxClientControlUnloadEventArgs = ASPxClientControlUnloadEventArgs;
13594window.ASPxClientEndFocusEventArgs = ASPxClientEndFocusEventArgs;
13595window.ASPxClientItemFocusedEventArgs = ASPxClientItemFocusedEventArgs;
13596window.ASPxClientControlCollection = ASPxClientControlCollection;
13597window.ASPxClientControlBase = ASPxClientControlBase;
13598window.ASPxClientControl = ASPxClientControl;
13599window.ASPxClientComponent = ASPxClientComponent;
13600})(ASPx);
13601
13602(function () {
13603 var PositionAnimationTransition = ASPx.CreateClass(ASPx.AnimationTransitionBase, {
13604  constructor: function (element, options) {
13605   this.constructor.prototype.constructor.call(this, element, options);
13606   this.direction = options.direction;
13607   this.animationTransition = this.createAnimationTransition();
13608   AnimationHelper.appendWKAnimationClassNameIfRequired(this.element);
13609  },
13610  Start: function (to) {
13611   var from = this.GetValue();
13612   if(ASPx.AnimationUtils.CanUseCssTransform()) {
13613    from = this.convertPosToCssTransformPos(from);
13614    to = this.convertPosToCssTransformPos(to);
13615   }
13616   this.animationTransition.Start(from, to);
13617  },
13618  SetValue: function (value) {
13619   ASPx.AnimationUtils.SetTransformValue(this.element, value, this.direction == AnimationHelper.SLIDE_VERTICAL_DIRECTION);
13620  },
13621  GetValue: function () {
13622   return ASPx.AnimationUtils.GetTransformValue(this.element, this.direction == AnimationHelper.SLIDE_VERTICAL_DIRECTION);
13623  },
13624  createAnimationTransition: function () {
13625   var transition = ASPx.AnimationUtils.CanUseCssTransform() ? this.createTransformAnimationTransition() : this.createPositionAnimationTransition();
13626   transition.transition = ASPx.AnimationConstants.Transitions.POW_EASE_OUT;
13627   return transition;
13628  },
13629  createTransformAnimationTransition: function () {
13630   return ASPx.AnimationUtils.createCssAnimationTransition(this.element, {
13631    property: ASPx.AnimationUtils.CanUseCssTransform(),
13632    duration: this.duration,
13633    onComplete: this.onComplete
13634   });
13635  },
13636  createPositionAnimationTransition: function () {
13637   return AnimationHelper.createAnimationTransition(this.element, {
13638    property: this.direction == AnimationHelper.SLIDE_VERTICAL_DIRECTION ? "top" : "left",
13639    unit: "px",
13640    duration: this.duration,
13641    onComplete: this.onComplete
13642   });
13643  },
13644  convertPosToCssTransformPos: function (position) {
13645   return ASPx.AnimationUtils.GetTransformCssText(position, this.direction == AnimationHelper.SLIDE_VERTICAL_DIRECTION);
13646  }
13647 });
13648 var AnimationHelper = {
13649  SLIDE_HORIZONTAL_DIRECTION: 0,
13650  SLIDE_VERTICAL_DIRECTION: 1,
13651  SLIDE_TOP_DIRECTION: 0,
13652  SLIDE_RIGHT_DIRECTION: 1,
13653  SLIDE_BOTTOM_DIRECTION: 2,
13654  SLIDE_LEFT_DIRECTION: 3,
13655  SLIDE_CONTAINER_CLASS: "dxAC",
13656  MAXIMUM_DEPTH: 3,
13657  createAnimationTransition: function (element, options) {
13658   if(options.onStep)
13659    options.animationEngineType = AnimationEngineType.JS;
13660   switch(options.animationEngineType) {
13661    case AnimationEngineType.JS:
13662     return ASPx.AnimationUtils.createJsAnimationTransition(element, options);
13663    case AnimationEngineType.CSS:
13664     return ASPx.AnimationUtils.createCssAnimationTransition(element, options);
13665    default:
13666     return ASPx.AnimationUtils.CanUseCssTransition() ? ASPx.AnimationUtils.createCssAnimationTransition(element, options) :
13667      ASPx.AnimationUtils.createJsAnimationTransition(element, options);
13668   }
13669  },
13670  createMultipleAnimationTransition: function (element, options) {
13671   return ASPx.AnimationUtils.createMultipleAnimationTransition(element, options);
13672  },
13673  createSimpleAnimationTransition: function (options) {
13674   return ASPx.AnimationUtils.createSimpleAnimationTransition(options);
13675  },
13676  cancelAnimation: function (element) {
13677   ASPx.AnimationTransitionBase.Cancel(element);
13678  },
13679  fadeIn: function(element, onComplete, duration, animationEngineType) {
13680   AnimationHelper.fadeTo(element, {
13681    from: 0, to: 1,
13682    onComplete: onComplete,
13683    animationEngineType: animationEngineType || AnimationEngineType.DEFAULT,
13684    duration: duration || ASPx.AnimationConstants.Durations.DEFAULT
13685   });
13686  },
13687  fadeOut: function(element, onComplete, duration, animationEngineType) {
13688   AnimationHelper.fadeTo(element, {
13689    from: ASPx.GetElementOpacity(element), to: 0,
13690    onComplete: onComplete,
13691    animationEngineType: animationEngineType || AnimationEngineType.DEFAULT,
13692    duration: duration || ASPx.AnimationConstants.Durations.DEFAULT
13693   });
13694  },
13695  fadeTo: function (element, options) {
13696   options.property = "opacity";
13697   if(!options.duration)
13698    options.duration = ASPx.AnimationConstants.Durations.SHORT;
13699   var transition = AnimationHelper.createAnimationTransition(element, options);
13700   if(!ASPx.IsExists(options.from))
13701    options.from = transition.GetValue();
13702   transition.Start(options.from, options.to);
13703  },
13704  slideIn: function (element, direction, onComplete, animationEngineType, rtl) {
13705   AnimationHelper.setOpacity(element, 1);
13706   var animationContainer = AnimationHelper.getSlideAnimationContainer(element, true, true);
13707   var pos = AnimationHelper.getSlideInStartPos(animationContainer, direction, rtl);
13708   var transition = AnimationHelper.createSlideTransition(animationContainer, direction,
13709    function (el) {
13710     AnimationHelper.resetSlideAnimationContainerSize(animationContainer);
13711     if(onComplete)
13712      onComplete(el);
13713    }, animationEngineType, rtl);
13714   transition.Start(pos, 0);
13715  },
13716  slideOut: function (element, direction, onComplete, animationEngineType, rtl) {
13717   var animationContainer = AnimationHelper.getSlideAnimationContainer(element, true, true);
13718   var pos = AnimationHelper.getSlideOutFinishPos(animationContainer, direction, rtl);
13719   var transition = AnimationHelper.createSlideTransition(animationContainer, direction,
13720    function (el) {
13721     AnimationHelper.setOpacity(el.firstChild, 0);
13722     if(onComplete)
13723      onComplete(el);
13724    }, animationEngineType, rtl);
13725   transition.Start(pos);
13726  },
13727  slideTo: function (element, options) {
13728   if(!ASPx.IsExists(options.direction))
13729    options.direction = AnimationHelper.SLIDE_HORIZONTAL_DIRECTION;
13730   var transition = new PositionAnimationTransition(element, options);
13731   transition.Start(options.to);
13732  },
13733  setOpacity: function (element, value) {
13734   ASPx.AnimationUtils.setOpacity(element, value);
13735  },
13736  appendWKAnimationClassNameIfRequired: function (element) {
13737   if(ASPx.AnimationUtils.CanUseCssTransform() && ASPx.Browser.WebKitFamily && !ASPx.ElementHasCssClass(element, "dx-wbv"))
13738    element.className += " dx-wbv";
13739  },
13740  findSlideAnimationContainer: function (element) {
13741   var container = element;
13742   for(var i = 0; i < AnimationHelper.MAXIMUM_DEPTH; i++) {
13743    if(container.tagName == "BODY")
13744     return null;
13745    if(ASPx.ElementHasCssClass(container, AnimationHelper.SLIDE_CONTAINER_CLASS))
13746     return container;
13747    container = container.parentNode;
13748   }
13749   return null;
13750  },
13751  createSlideAnimationContainer: function (element) {
13752   var rootContainer = document.createElement("DIV");
13753   ASPx.SetStyles(rootContainer, {
13754    className: AnimationHelper.SLIDE_CONTAINER_CLASS,
13755    overflow: "hidden"
13756   });
13757   var elementContainer = document.createElement("DIV");
13758   rootContainer.appendChild(elementContainer);
13759   var parentNode = element.parentNode;
13760   parentNode.insertBefore(rootContainer, element);
13761   elementContainer.appendChild(element);
13762   return rootContainer;
13763  },
13764  getSlideAnimationContainer: function (element, create, fixSize) {
13765   if(!element) return;
13766   var width = element.offsetWidth;
13767   var height = element.offsetHeight;
13768   var container;
13769   if(element.className == AnimationHelper.SLIDE_CONTAINER_CLASS)
13770    container = element;
13771   if(!container)
13772    container = AnimationHelper.findSlideAnimationContainer(element);
13773   if(!container && create)
13774    container = AnimationHelper.createSlideAnimationContainer(element);
13775   if(container && fixSize) {
13776    ASPx.SetStyles(container, {
13777     width: width, height: height
13778    });
13779    ASPx.SetStyles(container.firstChild, {
13780     width: width, height: height
13781    });
13782   }
13783   return container;
13784  },
13785  resetSlideAnimationContainerSize: function (container) {
13786   ASPx.SetStyles(container, {
13787    width: "", height: ""
13788   });
13789   ASPx.SetStyles(container.firstChild, {
13790    width: "", height: ""
13791   });
13792  },
13793  getModifyProperty: function (direction, rtl) {
13794   if(direction == AnimationHelper.SLIDE_TOP_DIRECTION || direction == AnimationHelper.SLIDE_BOTTOM_DIRECTION)
13795    return "marginTop";
13796   return rtl ? "margin-right" : "margin-left";
13797  },
13798  createSlideTransition: function (animationContainer, direction, complete, animationEngineType, rtl) {
13799   if(rtl == undefined)
13800    rtl = false;
13801   return AnimationHelper.createAnimationTransition(animationContainer.firstChild, {
13802    unit: "px",
13803    property: AnimationHelper.getModifyProperty(direction, rtl),
13804    onComplete: complete,
13805    animationEngineType: animationEngineType
13806   });
13807  },
13808  getSlideInStartPos: function (animationContainer, direction, rtl) {
13809   var dir = rtl ? -1 : 1;
13810   switch (direction) {
13811    case AnimationHelper.SLIDE_TOP_DIRECTION:
13812     return animationContainer.offsetHeight;
13813    case AnimationHelper.SLIDE_LEFT_DIRECTION:
13814     return animationContainer.offsetWidth * dir;
13815    case AnimationHelper.SLIDE_RIGHT_DIRECTION:
13816     return -animationContainer.offsetWidth * dir;
13817    case AnimationHelper.SLIDE_BOTTOM_DIRECTION:
13818     return -animationContainer.offsetHeight;
13819   }
13820  },
13821  getSlideOutFinishPos: function (animationContainer, direction, rtl) {
13822   var dir = rtl ? -1 : 1;
13823   switch (direction) {
13824    case AnimationHelper.SLIDE_TOP_DIRECTION:
13825     return -animationContainer.offsetHeight;
13826    case AnimationHelper.SLIDE_LEFT_DIRECTION:
13827     return -animationContainer.offsetWidth * dir;
13828    case AnimationHelper.SLIDE_RIGHT_DIRECTION:
13829     return animationContainer.offsetWidth * dir;
13830    case AnimationHelper.SLIDE_BOTTOM_DIRECTION:
13831     return animationContainer.offsetHeight;
13832   }
13833  }
13834 };
13835 var GestureHandler = ASPx.CreateClass(null, {
13836  constructor: function (getAnimationElement, canHandle, allowStart) {
13837   this.getAnimationElement = getAnimationElement;
13838   this.canHandle = canHandle;
13839   this.allowStart = allowStart;
13840   this.startMousePosX = 0;
13841   this.startMousePosY = 0;
13842   this.startTime = null;
13843   this.isEventsPrevented = false;
13844   this.savedElements = [];
13845  },
13846  OnSelectStart: function(evt) {
13847   ASPx.Evt.PreventEvent(evt); 
13848  },
13849  OnDragStart: function(evt) {
13850   ASPx.Evt.PreventEvent(evt);  
13851  },
13852  OnMouseDown: function (evt) {
13853   this.startMousePosX = ASPx.Evt.GetEventX(evt);
13854   this.startMousePosY = ASPx.Evt.GetEventY(evt);
13855   this.startTime = new Date();
13856  },
13857  OnMouseMove: function(evt) {
13858   if(!ASPx.Browser.MobileUI)
13859    ASPx.Selection.Clear();
13860   if(Math.abs(this.GetCurrentDistanceX(evt)) < GestureHandler.SLIDER_MIN_START_DISTANCE && Math.abs(this.GetCurrentDistanceY(evt)) < GestureHandler.SLIDER_MIN_START_DISTANCE)
13861    GesturesHelper.isExecutedGesture = false;
13862  },
13863  OnMouseUp: function (evt) {
13864  },
13865  CanHandleEvent: function (evt) {
13866   return !this.canHandle || this.canHandle(evt);
13867  },
13868  IsStartAllowed: function(value) {
13869   return !this.allowStart || this.allowStart(value);
13870  },
13871  RollbackGesture: function () {
13872  },
13873  GetRubberPosition: function (position) {
13874   return position / GestureHandler.FACTOR_RUBBER;
13875  },
13876  GetCurrentDistanceX: function (evt) {
13877   return ASPx.Evt.GetEventX(evt) - this.startMousePosX;
13878  },
13879  GetCurrentDistanceY: function (evt) {
13880   return ASPx.Evt.GetEventY(evt) - this.startMousePosY;
13881  },
13882  GetDistanceLimit: function () {
13883   return (new Date() - this.startTime) < GestureHandler.MAX_TIME_SPAN ? GestureHandler.MIN_DISTANCE_LIMIT : GestureHandler.MAX_DISTANCE_LIMIT;
13884  },
13885  GetContainerElement: function () {
13886  },
13887  AttachPreventEvents: function (evt) {
13888   if(!this.isEventsPrevented) {
13889    var element = ASPx.Evt.GetEventSource(evt);
13890    var container = this.GetContainerElement();
13891    while(element && element != container) {
13892     ASPx.Evt.AttachEventToElement(element, "mouseup", ASPx.Evt.PreventEvent);
13893     ASPx.Evt.AttachEventToElement(element, "click", ASPx.Evt.PreventEvent);
13894     this.savedElements.push(element);
13895     element = element.parentNode;
13896    }
13897    this.isEventsPrevented = true;
13898   }
13899  },
13900  DetachPreventEvents: function () {
13901   if(this.isEventsPrevented) {
13902    window.setTimeout(function () {
13903     while(this.savedElements.length > 0) {
13904      var element = this.savedElements.pop();
13905      ASPx.Evt.DetachEventFromElement(element, "mouseup", ASPx.Evt.PreventEvent);
13906      ASPx.Evt.DetachEventFromElement(element, "click", ASPx.Evt.PreventEvent);
13907     }
13908    }.aspxBind(this), 0);
13909    this.isEventsPrevented = false;
13910   }
13911  }
13912 });
13913 GestureHandler.MAX_DISTANCE_LIMIT = 70;
13914 GestureHandler.MIN_DISTANCE_LIMIT = 10;
13915 GestureHandler.MIN_START_DISTANCE = 0;
13916 GestureHandler.SLIDER_MIN_START_DISTANCE = 5;
13917 GestureHandler.MAX_TIME_SPAN = 300;
13918 GestureHandler.FACTOR_RUBBER = 4;
13919 GestureHandler.RETURN_ANIMATION_DURATION = 150;
13920 var SwipeSlideGestureHandler = ASPx.CreateClass(GestureHandler, {
13921  constructor: function (getAnimationElement, direction, canHandle, backward, forward, rollback, move) {
13922   this.constructor.prototype.constructor.call(this, getAnimationElement, canHandle);
13923   this.slideElement = this.getAnimationElement();
13924   this.container = this.slideElement.parentNode;
13925   this.direction = direction;
13926   this.backward = backward;
13927   this.forward = forward;
13928   this.rollback = rollback;
13929   this.slideElementSize = 0;
13930   this.containerElementSize = 0;
13931   this.startSliderElementPosition = 0;
13932   this.centeredSlideElementPosition = 0;
13933  },
13934  OnMouseDown: function (evt) {
13935   GestureHandler.prototype.OnMouseDown.call(this, evt);
13936   this.slideElementSize = this.GetElementSize();
13937   this.startSliderElementPosition = this.GetElementPosition();
13938   this.containerElementSize = this.GetContainerElementSize();
13939   if(this.slideElementSize <= this.containerElementSize)
13940    this.centeredSlideElementPosition = (this.containerElementSize - this.slideElementSize) / 2;
13941  },
13942  OnMouseMove: function (evt) {
13943   GestureHandler.prototype.OnMouseMove.call(this, evt);
13944   if(!ASPx.Browser.TouchUI && !ASPx.GetIsParent(this.container, ASPx.Evt.GetEventSource(evt))) {
13945    GesturesHelper.OnDocumentMouseUp(evt);
13946    return;
13947   }
13948   var distance = this.GetCurrentDistance(evt);
13949   if(Math.abs(distance) < GestureHandler.SLIDER_MIN_START_DISTANCE || ASPx.TouchUIHelper.isGesture)
13950    return;
13951   this.SetElementPosition(this.GetCalculatedPosition(distance));
13952   this.AttachPreventEvents(evt);
13953   ASPx.Evt.PreventEvent(evt);
13954  },
13955  GetCalculatedPosition: function (distance) {
13956   ASPx.AnimationTransitionBase.Cancel(this.slideElement);
13957   var position = this.startSliderElementPosition + distance,
13958    maxPosition = -(this.slideElementSize - this.containerElementSize),
13959    minPosition = 0;
13960   if(this.centeredSlideElementPosition > 0)
13961    position = this.GetRubberPosition(distance) + this.centeredSlideElementPosition;
13962   else if(position > minPosition)
13963    position = this.GetRubberPosition(distance);
13964   else if(position < maxPosition)
13965    position = this.GetRubberPosition(distance) + maxPosition;
13966   return position;
13967  },
13968  OnMouseUp: function (evt) {
13969   this.DetachPreventEvents();
13970   if(this.GetCurrentDistance(evt) != 0)
13971    this.OnMouseUpCore(evt);
13972  },
13973  OnMouseUpCore: function (evt) {
13974   var distance = this.GetCurrentDistance(evt);
13975   if(this.centeredSlideElementPosition > 0 || this.CheckSlidePanelIsOutOfBounds())
13976    this.PerformRollback();
13977   else
13978    this.PerformAction(distance);
13979  },
13980  PerformAction: function (distance) {
13981   if(Math.abs(distance) < this.GetDistanceLimit())
13982    this.PerformRollback();
13983   else if(distance < 0)
13984    this.PerformForward();
13985   else
13986    this.PerformBackward();
13987  },
13988  PerformBackward: function () {
13989   this.backward();
13990  },
13991  PerformForward: function () {
13992   this.forward();
13993  },
13994  PerformRollback: function () {
13995   this.rollback();
13996  },
13997  CheckSlidePanelIsOutOfBounds: function () {
13998   var minOffset = -(this.slideElementSize - this.containerElementSize), maxOffset = 0;
13999   var slideElementPos = this.GetElementPosition();
14000   if(slideElementPos > maxOffset || slideElementPos < minOffset)
14001    return true;
14002   return false;
14003  },
14004  GetContainerElement: function () {
14005   return this.container;
14006  },
14007  GetElementSize: function () {
14008   return this.IsHorizontalDirection() ? this.slideElement.offsetWidth : this.slideElement.offsetHeight;
14009  },
14010  GetContainerElementSize: function () {
14011   return this.IsHorizontalDirection() ? ASPx.GetClearClientWidth(this.container) : ASPx.GetClearClientHeight(this.container);
14012  },
14013  GetCurrentDistance: function (evt) {
14014   return this.IsHorizontalDirection() ? this.GetCurrentDistanceX(evt) : this.GetCurrentDistanceY(evt);
14015  },
14016  GetElementPosition: function () {
14017   return ASPx.AnimationUtils.GetTransformValue(this.slideElement, !this.IsHorizontalDirection());
14018  },
14019  SetElementPosition: function (position) {
14020   ASPx.AnimationUtils.SetTransformValue(this.slideElement, position, !this.IsHorizontalDirection());
14021  },
14022  IsHorizontalDirection: function () {
14023   return this.direction == AnimationHelper.SLIDE_HORIZONTAL_DIRECTION;
14024  }
14025 });
14026 var SwipeSimpleSlideGestureHandler = ASPx.CreateClass(SwipeSlideGestureHandler, {
14027  constructor: function (getAnimationElement, direction, canHandle, backward, forward, rollback, updatePosition) {
14028   this.constructor.prototype.constructor.call(this, getAnimationElement, direction, canHandle, backward, forward, rollback);
14029   this.container = this.slideElement;
14030   this.updatePosition = updatePosition;
14031   this.prevDistance = 0;
14032  },
14033  OnMouseDown: function (evt) {
14034   GestureHandler.prototype.OnMouseDown.call(this, evt);
14035   this.prevDistance = 0;
14036  },
14037  OnMouseUpCore: function (evt) {
14038   this.PerformAction(this.GetCurrentDistance(evt));
14039  },
14040  PerformAction: function (distance) {
14041   if(Math.abs(distance) < this.GetDistanceLimit())
14042    this.PerformRollback();
14043   else if(distance < 0)
14044    this.PerformForward();
14045   else
14046    this.PerformBackward();
14047  },
14048  GetCalculatedPosition: function (distance) {
14049   var position = distance - this.prevDistance;
14050   this.prevDistance = distance;
14051   return position;
14052  },
14053  SetElementPosition: function (position) {
14054   this.updatePosition(position);
14055  }
14056 });
14057 var SwipeGestureHandler = ASPx.CreateClass(GestureHandler, {
14058  constructor: function (getAnimationElement, canHandle, allowStart, start, allowComplete, complete, cancel, animationEngineType, rtl) {
14059   this.constructor.prototype.constructor.call(this, getAnimationElement, canHandle, allowStart);
14060   this.start = start;
14061   this.allowComplete = allowComplete;
14062   this.complete = complete;
14063   this.cancel = cancel;
14064   this.animationTween = null;
14065   this.currentDistanceX = 0;
14066   this.currentDistanceY = 0;
14067   this.tryStartGesture = false;
14068   this.tryStartScrolling = false;
14069   this.animationEngineType = animationEngineType;
14070   this.rtl = rtl;
14071   this.UpdateAnimationContainer();
14072  },
14073  UpdateAnimationContainer: function () {
14074   this.animationContainer = AnimationHelper.getSlideAnimationContainer(this.getAnimationElement(), true, false);
14075  },
14076  CanHandleEvent: function (evt) {
14077   if(GestureHandler.prototype.CanHandleEvent.call(this, evt))
14078    return true;
14079   return this.animationTween && this.animationContainer && ASPx.GetIsParent(this.animationContainer, ASPx.Evt.GetEventSource(evt));
14080  },
14081  OnMouseDown: function (evt) {
14082   GestureHandler.prototype.OnMouseDown.call(this, evt);
14083   if(this.animationTween)
14084    this.animationTween.Cancel();
14085   this.currentDistanceX = 0;
14086   this.currentDistanceY = 0;
14087   this.tryStartGesture = false;
14088   this.tryStartScrolling = false;
14089  },
14090  OnMouseMove: function (evt) {
14091   GestureHandler.prototype.OnMouseMove.call(this, evt);
14092   var isZoomGestureConflict = evt.touches && evt.touches.length > 1;
14093   if (isZoomGestureConflict)
14094    return false;
14095   this.currentDistanceX = this.GetCurrentDistanceX(evt);
14096   this.currentDistanceY = this.GetCurrentDistanceY(evt);
14097   if(this.rtl)
14098    this.currentDistanceX = -this.currentDistanceX;
14099   if(!this.animationTween && !this.tryStartScrolling && (Math.abs(this.currentDistanceX) >
14100    GestureHandler.MIN_START_DISTANCE || Math.abs(this.currentDistanceY) > GestureHandler.MIN_START_DISTANCE)) {
14101    if(Math.abs(this.currentDistanceY) < Math.abs(this.currentDistanceX)) {
14102     this.tryStartGesture = true;
14103     if(this.IsStartAllowed(this.currentDistanceX)) {
14104      this.animationContainer = AnimationHelper.getSlideAnimationContainer(this.getAnimationElement(), true, true);
14105      this.animationTween = AnimationHelper.createSlideTransition(this.animationContainer, AnimationHelper.SLIDE_LEFT_DIRECTION,
14106       function () {
14107        AnimationHelper.resetSlideAnimationContainerSize(this.animationContainer);
14108        this.animationContainer = null;
14109        this.animationTween = null;
14110       }.aspxBind(this), this.animationEngineType, this.rtl);
14111      this.PerformStart(this.currentDistanceX);
14112      this.AttachPreventEvents(evt);
14113     }
14114    }
14115    else
14116     this.tryStartScrolling = true;
14117   }
14118   if(this.animationTween) {
14119    if(this.allowComplete && !this.allowComplete(this.currentDistanceX))
14120     this.currentDistanceX = this.GetRubberPosition(this.currentDistanceX);
14121    this.animationTween.SetValue(this.currentDistanceX);
14122   }
14123   if(!this.tryStartScrolling && !ASPx.TouchUIHelper.isGesture && evt.touches && evt.touches.length < 2)
14124    ASPx.Evt.PreventEvent(evt);
14125  },
14126  OnMouseUp: function (evt) {
14127   if(!this.animationTween) {
14128    if(this.tryStartGesture)
14129     this.PerformCancel(this.currentDistanceX);
14130   }
14131   else {
14132    if(Math.abs(this.currentDistanceX) < this.GetDistanceLimit())
14133     this.RollbackGesture();
14134    else {
14135     if(this.IsCompleteAllowed(this.currentDistanceX)) {
14136      this.PerformComplete(this.currentDistanceX);
14137      this.animationContainer = null;
14138      this.animationTween = null;
14139     }
14140     else
14141      this.RollbackGesture();
14142    }
14143   }
14144   this.DetachPreventEvents();
14145   this.tryStartGesture = false;
14146   this.tryStartScrolling = false;
14147  },
14148  PerformStart: function (value) {
14149   if(this.start)
14150    this.start(value);
14151  },
14152  IsCompleteAllowed: function (value) {
14153   return !this.allowComplete || this.allowComplete(value);
14154  },
14155  PerformComplete: function (value) {
14156   if(this.complete)
14157    this.complete(value);
14158  },
14159  PerformCancel: function (value) {
14160   if(this.cancel)
14161    this.cancel(value);
14162  },
14163  RollbackGesture: function () {
14164   this.animationTween.Start(this.currentDistanceX, 0);
14165  },
14166  ResetGestureElementPosition: function () {
14167   if (this.currentDistanceX === 0) return;
14168   var container = AnimationHelper.getSlideAnimationContainer(this.getAnimationElement());
14169   var onComplete = function () { AnimationHelper.resetSlideAnimationContainerSize(container); };
14170   var animation = AnimationHelper.createSlideTransition(container, AnimationHelper.SLIDE_LEFT_DIRECTION, onComplete, this.animationEngineType, this.rtl);
14171   animation.Start(this.currentDistanceX, 0);
14172  },
14173  GetContainerElement: function () {
14174   return this.animationContainer;
14175  }
14176 });
14177 var GesturesHelper = {
14178  handlers: {},
14179  activeHandler: null,
14180  isAttachedEvents: false,
14181  isExecutedGesture: false,
14182  AddSwipeGestureHandler: function (id, getAnimationElement, canHandle, allowStart, start, allowComplete, complete, cancel, animationEngineType, rtl) {
14183   this.handlers[id] = new SwipeGestureHandler(getAnimationElement, canHandle, allowStart, start, allowComplete, complete, cancel, animationEngineType, rtl);
14184  },
14185  UpdateSwipeAnimationContainer: function (id) {
14186   if(this.handlers[id])
14187    this.handlers[id].UpdateAnimationContainer();
14188  },
14189  AddSwipeSlideGestureHandler: function (id, getAnimationElement, direction, canHandle, backward, forward, rollback, updatePosition) {
14190   if(updatePosition)
14191    this.handlers[id] = new SwipeSimpleSlideGestureHandler(getAnimationElement, direction, canHandle, backward, forward, rollback, updatePosition);
14192   else
14193    this.handlers[id] = new SwipeSlideGestureHandler(getAnimationElement, direction, canHandle, backward, forward, rollback);
14194  },
14195  getParentDXEditorWithSwipeGestures: function(element) {
14196     return ASPx.GetParent(element, function(parent) {
14197      var parentObj = ASPx.GetControlCollection().Get(parent.id);
14198      return parentObj && parentObj.supportGestures && parentObj.isSwipeGesturesEnabled();
14199   });
14200  },
14201  canHandleMouseDown: function(evt) {
14202   if(!ASPx.Evt.IsLeftButtonPressed(evt))
14203    return false;
14204   var element = ASPx.Evt.GetEventSource(evt);
14205   var dxFocusedEditor = ASPx.Ident.scripts.ASPxClientEdit && ASPx.GetFocusedEditor();
14206   if(dxFocusedEditor && dxFocusedEditor.IsEditorElement(element)) {
14207    var elementParentDXEditorWithSwipeGestures = GesturesHelper.getParentDXEditorWithSwipeGestures(element);
14208    if(!elementParentDXEditorWithSwipeGestures || !dxFocusedEditor.IsEditorElement(elementParentDXEditorWithSwipeGestures))
14209     return false;
14210   }
14211   var isTextEditor = element.tagName == "TEXTAREA" || element.tagName == "INPUT" && ASPx.Attr.GetAttribute(element, "type") == "text";
14212   if(isTextEditor && document.activeElement == element)
14213    return false;
14214   return true;  
14215  },
14216  OnDocumentDragStart: function(evt) {
14217   if(GesturesHelper.activeHandler)
14218    GesturesHelper.activeHandler.OnDragStart(evt);
14219  },
14220  OnDocumentMouseDown: function (evt) {
14221   if(!GesturesHelper.canHandleMouseDown(evt))
14222    return;
14223   GesturesHelper.activeHandler = GesturesHelper.FindHandler(evt);
14224   if(GesturesHelper.activeHandler)
14225    GesturesHelper.activeHandler.OnMouseDown(evt);
14226  },
14227  OnDocumentMouseMove: function (evt) {
14228   if(GesturesHelper.activeHandler) {
14229    GesturesHelper.isExecutedGesture = true;
14230    GesturesHelper.activeHandler.OnMouseMove(evt);
14231   }
14232  },
14233  OnDocumentMouseUp: function (evt) {
14234   if(GesturesHelper.activeHandler) {
14235    GesturesHelper.activeHandler.OnMouseUp(evt);
14236    GesturesHelper.activeHandler = null;
14237    window.setTimeout(function () { GesturesHelper.isExecutedGesture = false; }, 0);
14238   }
14239  },
14240  AttachEvents: function () {
14241   if(!GesturesHelper.isAttachedEvents) {
14242    GesturesHelper.Attach(ASPx.Evt.AttachEventToElement);
14243    GesturesHelper.isAttachedEvents = true;
14244   }
14245  },
14246  DetachEvents: function () {
14247   if(GesturesHelper.isAttachedEvents) {
14248    GesturesHelper.Attach(ASPx.Evt.DetachEventFromElement);
14249    GesturesHelper.isAttachedEvents = false;
14250   }
14251  },
14252  Attach: function (changeEventsMethod) {
14253   var doc = window.document;
14254   changeEventsMethod(doc, ASPx.TouchUIHelper.touchMouseDownEventName, GesturesHelper.OnDocumentMouseDown);
14255   changeEventsMethod(doc, ASPx.TouchUIHelper.touchMouseMoveEventName, GesturesHelper.OnDocumentMouseMove);
14256   changeEventsMethod(doc, ASPx.TouchUIHelper.touchMouseUpEventName, GesturesHelper.OnDocumentMouseUp);
14257   if(!ASPx.Browser.MobileUI) {
14258    changeEventsMethod(doc, "dragstart", GesturesHelper.OnDocumentDragStart);
14259   }
14260  },
14261  FindHandler: function (evt) {
14262   var handlers = [];
14263   for(var id in GesturesHelper.handlers) {
14264    if(GesturesHelper.handlers.hasOwnProperty(id)) {
14265     var handler = GesturesHelper.handlers[id];
14266     if(handler.CanHandleEvent && handler.CanHandleEvent(evt))
14267      handlers.push(handler);
14268    }
14269   }
14270   if(!handlers.length)
14271    return null;
14272   handlers.sort(function (a, b) {
14273    return ASPx.GetIsParent(a.getAnimationElement(), b.getAnimationElement()) ? 1 : -1;
14274   });
14275   return handlers[0];
14276  },
14277  IsExecutedGesture: function () {
14278   return GesturesHelper.isExecutedGesture;
14279  }
14280 };
14281 GesturesHelper.AttachEvents();
14282 var AnimationEngineType = {
14283  "DEFAULT": 0,
14284  "CSS": 1,
14285  "JS": 2
14286 };
14287 ASPx.AnimationEngineType = AnimationEngineType;
14288 ASPx.AnimationHelper = AnimationHelper;
14289 ASPx.GesturesHelper = GesturesHelper;
14290})();
14291
14292(function() {
14293var ASPxClientButton = ASPx.CreateClass(ASPxClientControl, {
14294 constructor: function(name) {
14295  this.constructor.prototype.constructor.call(this, name);
14296  this.isASPxClientButton = true;
14297  this.allowFocus = true;
14298  this.autoPostBackFunction = null;
14299  this.causesValidation = true;
14300  this.checked = false;
14301  this.clickLocked = false;
14302  this.groupName = "";
14303  this.focusElementSelected = false;
14304  this.pressed = false;
14305  this.useSubmitBehavior = true;
14306  this.validationGroup = "";
14307  this.validationContainerID = null;
14308  this.validateInvisibleEditors = false;
14309  this.originalWidth = null;
14310  this.originalHeight = null;
14311  this.needUpdateBounds = true;
14312  this.isTextEmpty = false;
14313  this.isImage = false;
14314  this.CheckedChanged = new ASPxClientEvent();
14315  this.GotFocus = new ASPxClientEvent();
14316  this.LostFocus = new ASPxClientEvent();
14317  this.Click = new ASPxClientEvent();
14318 },
14319 InlineInitialize: function() {
14320  var mainElement = this.GetMainElement();
14321  this.originalWidth = mainElement.style.width;
14322  this.originalHeight = mainElement.style.height;
14323  ASPxClientControl.prototype.InlineInitialize.call(this);
14324  this.InitializeElementIDs();
14325  this.InitializeEvents();
14326  this.InitializeEnabled();
14327  this.InitializeChecked();
14328  if(this.IsLink())
14329   this.InitializeLink();
14330  this.PreventButtonImageDragging();
14331  this.EnsureBoundsAdjusted();
14332 },
14333 InitializeElementIDs: function(){
14334  var mainElement = this.GetMainElement();
14335  var contentElement = ASPx.GetNodeByTagName(mainElement, "DIV", 0);
14336  if(contentElement) contentElement.id = this.name + "_CD";
14337  var imageElement = ASPx.GetNodeByTagName(mainElement, "IMG", 0);
14338  if(imageElement) imageElement.id = this.name + "Img";
14339 },
14340 InitializeEnabled: function(){
14341  this.SetEnabledInternal(this.clientEnabled, true);
14342 },
14343 InitializeChecked: function(){
14344  this.SetCheckedInternal(this.checked, true);
14345 },
14346 InitializeLink: function(){
14347  var mainElement = this.GetMainElement();
14348  if(this.enabled)
14349   mainElement.href = "javascript:;";
14350  if(!this.allowFocus)
14351   mainElement.style.outline = 0;
14352  if(!this.isImage && !this.GetTextContainer())
14353   mainElement.style.fontSize = "0pt";
14354 },
14355 InitializeEvents: function(){
14356  if(!this.isNative && !this.IsLink()) {
14357   var element = this.GetInternalButton();
14358   if(element)
14359    element.onfocus = null;
14360   var textControl = this.GetTextControl();
14361   if(textControl)
14362    ASPx.Evt.PreventElementDragAndSelect(textControl, false);
14363  }
14364  this.onClick = function(evt) {
14365   var processOnServer = ASPx.BClick(this.name, evt);
14366   if(!processOnServer)
14367    ASPx.Evt.PreventEvent(evt);
14368   return processOnServer;
14369  }.aspxBind(this);
14370  this.onImageMoseDown = function() { var el = ASPx.GetFocusedElement(); if(el) el.blur(); };
14371  this.onGotFocus = function() { this.OnFocus(); }.aspxBind(this);
14372  this.onLostFocus = function() { this.OnLostFocus(); }.aspxBind(this);
14373  this.onKeyUp = function(evt) { this.OnKeyUp(evt); }.aspxBind(this);
14374  this.onKeyDown = function(evt) { this.OnKeyDown(evt); }.aspxBind(this); 
14375  if(!this.isNative && !this.IsLink())
14376   this.InitializeNativeHandlers();
14377 },
14378 InitializeNativeHandlers: function() {
14379  this.AttachNativeHandlerToMainElement("focus", "SetFocus");
14380  this.AttachNativeHandlerToMainElement("click", "DoClick");
14381 },
14382 EnsureBoundsAdjusted: function() {
14383  var mainElement = this.GetMainElement();
14384  this.needUpdateBounds = ASPx.GetCurrentStyle(mainElement).display === "block";
14385  if(this.needUpdateBounds) 
14386   mainElement.className = mainElement.className.replace("dxbTSys", "");
14387 },
14388 AdjustControlCore: function () {
14389  if(this.isNative || this.IsLink()) return;
14390  var buttonImage = this.GetButtonImage();  
14391  if(buttonImage && buttonImage.offsetHeight === 0 && buttonImage.offsetWidth === 0)
14392   buttonImage.onload = function() { this.UpdateSize(); }.aspxBind(this);
14393  else
14394   this.UpdateSize();
14395  this.UpdateVerticalAlign();
14396 },
14397 UpdateSize: function() {
14398  if(this.needUpdateBounds) {
14399   this.UpdateWidth();
14400   this.UpdateHeight();
14401  } else
14402   this.CorrectWrappedText(this.GetContentDiv, "Text", true);
14403 },
14404 UpdateVerticalAlign: function() {
14405  var contentElement = this.GetContentDiv();
14406  var verticalAlign = this.GetMainElement().style.verticalAlign;
14407  if(ASPx.IsExistsElement(contentElement) && verticalAlign)
14408   contentElement.style.verticalAlign = verticalAlign;
14409 },
14410 UpdateHeight: function(){
14411  if(this.isNative || this.IsLink() || this.originalHeight === null || ASPx.IsPercentageSize(this.originalHeight)) return;
14412  var height;
14413  var mainElement = this.GetMainElement();
14414  var contentDiv = this.GetContentDiv();
14415  var borderAndPadding = ASPx.GetTopBottomBordersAndPaddingsSummaryValue(mainElement);
14416  var contentHasExcessiveHeight = contentDiv.offsetHeight > mainElement.offsetHeight - borderAndPadding;
14417  var needSetAutoHeight = !this.originalHeight || (ASPx.Browser.Safari && contentHasExcessiveHeight);
14418  if(needSetAutoHeight) {
14419   mainElement.style.height = "";
14420   height = mainElement.offsetHeight - borderAndPadding;
14421  }
14422  else
14423   height = (ASPx.PxToInt(this.originalHeight) - borderAndPadding);
14424  if(height){
14425   mainElement.style.height = height + "px";
14426   if(contentDiv && contentDiv.offsetHeight > 0){
14427    var contentDivCurrentStyle = ASPx.GetCurrentStyle(contentDiv);
14428    var paddingTop = parseInt(contentDivCurrentStyle.paddingTop) || 0;
14429    var paddingBottom = parseInt(contentDivCurrentStyle.paddingBottom) || 0;
14430    var clientHeightDiff = height - contentDiv.offsetHeight;
14431    var verticalAlign = ASPx.GetCurrentStyle(mainElement).verticalAlign;
14432    if(verticalAlign == "top")
14433     paddingBottom = paddingBottom + clientHeightDiff;
14434    else if(verticalAlign == "bottom")
14435     paddingTop = paddingTop + clientHeightDiff;
14436    else {
14437     var halfClientHeightDiff = Math.floor(clientHeightDiff / 2);
14438     paddingTop = paddingTop + halfClientHeightDiff;
14439     paddingBottom = paddingBottom + (clientHeightDiff - halfClientHeightDiff);
14440    }
14441    contentDiv.style.paddingTop = (paddingTop > 0 ? paddingTop : 0) + "px";
14442    contentDiv.style.paddingBottom = (paddingBottom > 0 ? paddingBottom : 0) + "px";
14443   }
14444  }
14445 },
14446 UpdateWidth: function(){
14447  if(this.isNative || this.IsLink() || this.originalWidth === null) return;
14448  if(!ASPx.IsPercentageSize(this.originalWidth)) {
14449   var mainElement = this.GetMainElement();
14450   var borderAndPadding = ASPx.GetLeftRightBordersAndPaddingsSummaryValue(mainElement);
14451   if(this.originalWidth && ASPx.IsTextWrapped(this.GetTextContainer()))
14452    mainElement.style.width = (ASPx.PxToInt(this.originalWidth) - borderAndPadding) + "px";
14453   else
14454    mainElement.style.width = "auto";
14455   var width = mainElement.offsetWidth - borderAndPadding;
14456   if(this.originalWidth && width < ASPx.PxToInt(this.originalWidth) - borderAndPadding) 
14457    width = ASPx.PxToInt(this.originalWidth) - borderAndPadding;
14458   if(width)
14459    mainElement.style.width = (width > 0 ? width : 0)  + "px";
14460  }
14461  this.CorrectWrappedText(this.GetContentDiv, "Text", true);
14462 },
14463 GetAdjustedSizes: function() {
14464  var sizes = ASPxClientControl.prototype.GetAdjustedSizes.call(this);
14465  var image = this.GetButtonImage();
14466  if(image) {
14467   sizes.imageWidth = image.offsetWidth;
14468   sizes.imageHeight = image.offsetHeight;
14469  }
14470  return sizes;
14471 },
14472 PreventButtonImageDragging: function() {
14473  ASPx.Evt.PreventImageDragging(this.GetButtonImage());
14474 },
14475 AttachNativeHandlerToMainElement: function(handlerName, correspondingMethodName) {
14476  var mainElement = this.GetMainElement();
14477  if(!ASPx.IsExistsElement(mainElement))
14478   return;
14479  mainElement[handlerName] = function() { _aspxBCallButtonMethod(this.name, correspondingMethodName); }.aspxBind(this);
14480 },
14481 GetContentDiv: function(){
14482  return this.GetChildElement("CD");
14483 },       
14484 GetButtonImage: function(){
14485  return ASPx.CacheHelper.GetCachedElement(this, "buttonImage", 
14486   function() { 
14487    return ASPx.GetNodeByTagName(this.GetMainElement(), "IMG", 0); 
14488   });
14489 },
14490 GetInternalButton: function() {
14491  return ASPx.CacheHelper.GetCachedElement(this, "internalButton", 
14492   function() { 
14493    return this.isNative || this.IsLink() ? this.GetMainElement() : ASPx.GetNodeByTagName(this.GetMainElement(), "INPUT", 0);
14494   });
14495 },
14496 GetTextContainer: function() {
14497  return ASPx.CacheHelper.GetCachedElement(this, "textContainer", 
14498   function() { 
14499    if(this.isNative)
14500     return this.GetMainElement();
14501    else{
14502     var textElement = this.IsLink() ? this.GetMainElement() : this.GetContentDiv();
14503     return this.accessibilityCompliant ? ASPx.GetElementById(this.name + "_BTC") : ASPx.GetNodeByTagName(textElement, "SPAN", 0);
14504    }
14505   });
14506 },
14507 GetTextControl: function(){
14508  return ASPx.CacheHelper.GetCachedElement(this, "textControl", 
14509   function() { 
14510    var element = ASPx.GetParentByTagName(this.GetContentDiv(), "DIV");
14511    if(!ASPx.IsExistsElement(element) || (element.id == this.name))
14512     element = this.GetContentDiv();
14513    return element;
14514   });
14515 },
14516 IsLink: function(){
14517  if (this.GetMainElement())
14518   return this.GetMainElement().tagName === "A";
14519  return false;
14520 },   
14521 IsHovered: function(){
14522  var hoverElement = this.GetMainElement();
14523  return ASPx.GetStateController().currentHoverItemName == hoverElement.id;
14524 },   
14525 SetEnabledInternal: function(enabled, initialization) {
14526  if(!this.enabled)
14527   return;
14528  if(!initialization || !enabled)
14529   this.ChangeEnabledStateItems(enabled);
14530  this.ChangeEnabledAttributes(enabled);
14531 },
14532 ChangeEnabledAttributes: function(enabled) {
14533  var element = this.GetInternalButton();
14534  if(element) {
14535   if(this.IsLink()){
14536    var method = ASPx.Attr.ChangeAttributesMethod(enabled);
14537    var link = this.GetMainElement();
14538    method(link, "href");
14539    if(this.accessibilityCompliant)
14540     ASPx.Attr.SetOrRemoveAttribute(link, ASPx.Attr.GetTabIndexAttributeName(), enabled ? null : "0");
14541   } else {
14542    if(this.accessibilityCompliant)
14543     ASPx.Attr.Aria.SetOrRemoveDisabled(element, !enabled);
14544    else
14545     element.disabled = !enabled;
14546   }
14547  }
14548  this.ChangeEnabledEventsAttributes(ASPx.Attr.ChangeEventsMethod(enabled));
14549  var isFocusable = enabled || this.accessibilityCompliant;
14550  this.ChangeEnabledFocusEvents(ASPx.Attr.ChangeEventsMethod(isFocusable));
14551 },
14552 ChangeEnabledEventsAttributes: function(method) {
14553  var element = this.GetMainElement();
14554  method(element, "click", this.onClick);
14555  if(this.allowFocus){
14556   if(!this.isNative && !this.IsLink()) {
14557    element = this.GetInternalButton();
14558    if(element) {
14559     method(element, "keyup", this.onKeyUp);
14560     method(element, "blur", this.onKeyUp);
14561     method(element, "keydown", this.onKeyDown);
14562    }
14563   }
14564   if(ASPx.Browser.Firefox){
14565    var image = this.GetButtonImage();
14566    if(image)
14567     method(image, "mousedown", this.onImageMoseDown); 
14568   }
14569  }
14570 },
14571 ChangeEnabledFocusEvents: function(method) {
14572  if(!this.allowFocus)
14573   return;
14574  var element = !this.isNative && !this.IsLink() ? this.GetInternalButton() : this.GetMainElement();
14575  if(element) {
14576   method(element, "focus", this.onGotFocus);
14577   method(element, "blur", this.onLostFocus);
14578  }
14579 },
14580 ChangeEnabledStateItems: function(enabled){
14581  if(this.isNative) return;
14582  ASPx.GetStateController().SetElementEnabled(this.GetMainElement(), enabled);
14583  this.UpdateFocusedStyle();
14584 },
14585 RequiredPreventDoublePostback: function(){
14586  return ASPx.Browser.Firefox && !this.isNative; 
14587 },
14588 OnFocus: function() {
14589  if(!this.allowFocus)
14590   return false;
14591  this.focused = true;
14592  if(this.isInitialized)
14593   this.RaiseFocus();
14594  this.UpdateFocusedStyle();
14595 },  
14596 OnLostFocus: function() {
14597  if(!this.allowFocus)
14598   return false;
14599  this.focused = false;
14600  if(this.isInitialized)
14601   this.RaiseLostFocus();
14602  this.UpdateFocusedStyle();
14603 },
14604 CauseValidation: function() {
14605  if(this.causesValidation && ASPx.Ident.scripts.ASPxClientEdit)
14606   return this.validationContainerID != null ?
14607    ASPxClientEdit.ValidateEditorsInContainerById(this.validationContainerID, this.validationGroup, this.validateInvisibleEditors) :
14608    ASPxClientEdit.ValidateGroup(this.validationGroup, this.validateInvisibleEditors);
14609  else
14610   return true;
14611 },
14612 OnClick: function(evt) {
14613  if(this.clickLocked) return true;
14614  if(this.checked && this.groupName != "" && this.GetCheckedGroupList().length > 1) return;
14615  this.SetFocus();
14616  var isValid = this.CauseValidation();
14617  var processOnServer = this.autoPostBack;
14618  if(this.groupName != "") {
14619   if(this.GetCheckedGroupList().length == 1)
14620    this.SetCheckedInternal(!this.checked, false);
14621   else {
14622    this.SetCheckedInternal(true, false);
14623    this.ClearButtonGroupChecked(true);
14624   }
14625   processOnServer = this.RaiseCheckedChanged();
14626   if(processOnServer && isValid)
14627    this.SendPostBack("CheckedChanged");
14628  }
14629  var params = this.RaiseClick();
14630  if(evt && params.cancelEventAndBubble)
14631   ASPx.Evt.PreventEventAndBubble(evt);
14632  if(params.processOnServer && isValid)
14633   return this.ProcessClick();
14634  return false;
14635 },
14636 ProcessClick: function() {
14637  var requiredPreventDoublePostback = this.RequiredPreventDoublePostback();
14638  var postponePostback = ASPx.Browser.AndroidMobilePlatform; 
14639  if(requiredPreventDoublePostback || postponePostback)
14640   window.setTimeout(function() { _aspxBCallButtonMethod(this.name, "SendPostBack", "Click"); }.aspxBind(this), 0); 
14641  else
14642   this.SendPostBack("Click");
14643  return !requiredPreventDoublePostback;
14644 },
14645 OnKeyUp: function(evt) {
14646  if(!this.pressed)
14647   return;
14648  this.pressed = false;
14649  ASPx.GetStateController().OnKeyUpOnElement(evt);
14650 },
14651 OnKeyDown: function(evt) {
14652  if(evt.keyCode == ASPx.Key.Enter || evt.keyCode == ASPx.Key.Space)
14653   this.SetPressed();
14654 },
14655 GetCheckedGroupList: function(){
14656  var result = [ ];
14657  ASPx.GetControlCollection().ForEachControl(function(control) {
14658   if(ASPx.Ident.IsASPxClientButton(control) && (control.groupName == this.groupName) && !control.IsDOMDisposed())
14659    result.push(control);
14660  }, this);
14661  return result;
14662 },
14663 ClearButtonGroupChecked: function(raiseCheckedChanged){
14664  var list = this.GetCheckedGroupList();
14665  for(var i = 0; i < list.length; i ++){
14666   if(list[i] != this && list[i].checked) {
14667    list[i].SetCheckedInternal(false, false);
14668    if(raiseCheckedChanged)
14669     list[i].RaiseCheckedChanged();
14670   }
14671  }
14672 },
14673 ApplyCheckedStyle: function(){
14674  var stateController = ASPx.GetStateController();
14675  if(this.IsHovered()) 
14676   stateController.SetCurrentHoverElement(null);  
14677  stateController.SelectElementBySrcElement(this.GetMainElement());
14678 }, 
14679 ApplyUncheckedStyle: function(){
14680  var stateController = ASPx.GetStateController();
14681  if(this.IsHovered()) 
14682   stateController.SetCurrentHoverElement(null);
14683  stateController.DeselectElementBySrcElement(this.GetMainElement());
14684 },  
14685 SetCheckedInternal: function(checked, initialization){
14686  if(initialization && checked || (this.checked != checked)){
14687   this.checked = checked;
14688   if(checked)
14689    this.ApplyCheckedStyle();
14690   else
14691    this.ApplyUncheckedStyle();
14692  }
14693 },
14694 UpdateStateObject: function(){
14695  if(this.groupName != "")
14696   this.UpdateStateObjectWithObject({ checked: this.checked });
14697 },
14698 GetStateHiddenFieldName: function() {
14699  return this.uniqueID + "$State";
14700 },
14701 ApplyPressedStyle: function(){
14702  ASPx.GetStateController().OnMouseDownOnElement(this.GetMainElement());
14703 },
14704 ApplyUnpressedStyle: function(){ 
14705  ASPx.GetStateController().OnMouseUpOnElement(this.GetMainElement());
14706 },
14707 SetPressed: function(){
14708  this.pressed = true;
14709  this.ApplyPressedStyle();
14710 }, 
14711 SetUnpressed: function(){
14712  this.pressed = false;
14713  this.ApplyUnpressedStyle();
14714 },
14715 SetFocus: function(){
14716  if(!this.allowFocus || this.focused)
14717   return;
14718  var element = this.GetInternalButton();
14719  if(element) {
14720   var hiddenInternalButtonRequiresVisibilityToGetFocused = ASPx.Browser.WebKitFamily  && !this.isNative  && !this.IsLink();
14721   if(hiddenInternalButtonRequiresVisibilityToGetFocused)
14722    ASPxClientButton.MakeHiddenElementFocusable(element);
14723   if(ASPx.IsFocusable(element) && ASPx.GetActiveElement() != element)
14724    element.focus();
14725   if(hiddenInternalButtonRequiresVisibilityToGetFocused)
14726    ASPxClientButton.RestoreHiddenElementAppearance(element);
14727  }
14728 },
14729 ApplyFocusedStyle: function(){
14730  if(this.focusElementSelected) return;
14731  if(typeof(ASPx.GetStateController) != "undefined")
14732   ASPx.GetStateController().SelectElementBySrcElement(this.GetContentDiv());
14733  this.focusElementSelected = true;
14734 },
14735 ApplyUnfocusedStyle: function(){ 
14736  if(!this.focusElementSelected) return;
14737  if(typeof(ASPx.GetStateController) != "undefined")
14738   ASPx.GetStateController().DeselectElementBySrcElement(this.GetContentDiv());
14739  this.focusElementSelected = false;
14740 },
14741 UpdateFocusedStyle: function(){
14742  if(this.isNative || this.IsLink()) return;
14743  var isFocusable = this.enabled && this.allowFocus && this.focused && (this.clientEnabled || this.accessibilityCompliant);
14744  if(isFocusable)
14745   this.ApplyFocusedStyle();
14746  else
14747   this.ApplyUnfocusedStyle();
14748 },
14749 SendPostBack: function(postBackArg){
14750  if(!this.enabled || !this.clientEnabled)
14751   return;
14752  var arg = postBackArg || "";
14753  if(this.autoPostBackFunction)
14754   this.autoPostBackFunction(arg);
14755  else if(!this.useSubmitBehavior || this.IsLink())
14756   ASPxClientControl.prototype.SendPostBack.call(this, arg);
14757  if(this.useSubmitBehavior && !this.isNative) 
14758   this.ClickInternalButton();
14759 },
14760 ClickInternalButton: function(){
14761  var element = this.GetInternalButton();
14762  if(element) {
14763   this.clickLocked = true;
14764   if(ASPx.Browser.NetscapeFamily)
14765    this.CreateUniqueIDCarrier(); 
14766   var postHandler = ASPx.GetPostHandler();
14767   postHandler.SetLastSubmitElementName(element.name);
14768   ASPx.Evt.DoElementClick(element);
14769   postHandler.SetLastSubmitElementName(null);
14770   if(ASPx.Browser.NetscapeFamily)
14771    this.RemoveUniqueIDCarrier(); 
14772   this.clickLocked = false;
14773  }
14774 },
14775 CreateUniqueIDCarrier: function() {
14776  var name = this.uniqueID;
14777  var id = this.GetUniqueIDCarrierID();
14778  var field = ASPx.CreateHiddenField(name, id);
14779  var form = this.GetParentForm();
14780  if(form) form.appendChild(field);
14781 },
14782 RemoveUniqueIDCarrier: function() {
14783  var field = document.getElementById(this.GetUniqueIDCarrierID());
14784  if(field)
14785   field.parentNode.removeChild(field);
14786 },
14787 GetUniqueIDCarrierID: function() {
14788  return this.uniqueID + "_UIDC";
14789 },
14790 DoClick: function(){
14791  if(!this.enabled || !this.clientEnabled)
14792   return;
14793  var button = (this.isNative || this.IsLink()) ? this.GetMainElement() : this.GetInternalButton();
14794  if(button)
14795   ASPx.Evt.DoElementClick(button);
14796  else 
14797   this.OnClick();   
14798 },
14799 GetChecked: function(){
14800  return this.checked;
14801 },
14802 SetChecked: function(checked){
14803  this.SetCheckedInternal(checked, false);
14804  this.ClearButtonGroupChecked(false);
14805 },
14806 GetText: function(){
14807  if(!this.isTextEmpty)
14808   return this.isNative ? this.GetTextContainer().value : this.GetTextContainer().innerHTML;
14809  return "";
14810 },
14811 SetText: function(text){
14812  this.isTextEmpty = (text == null || text == "");
14813  var textContainer = this.GetTextContainer();
14814  if(textContainer){
14815   if(this.isNative)
14816    textContainer.value = (text != null) ? text : "";
14817   else {
14818    var value = this.isTextEmpty ? "&nbsp;" : text;
14819      textContainer.innerHTML = value;
14820    var element = this.GetInternalButton();
14821    if(element)
14822     element.value = value;
14823   }
14824   this.UpdateSize();
14825  }
14826 },
14827 GetImageUrl: function(){
14828  var img = this.GetButtonImage();
14829  return img ?  img.src : "";
14830 },
14831 SetImageUrl: function(url){
14832  var img = this.GetButtonImage();
14833  if(img) {
14834   img.src = url;
14835   this.UpdateSize();
14836  }
14837 },
14838 SetEnabled: function(enabled){
14839  if(this.clientEnabled != enabled) {
14840   if(!enabled && this.focused)
14841    this.OnLostFocus();
14842   this.clientEnabled = enabled;
14843   this.SetEnabledInternal(enabled, false);
14844  }
14845 },
14846 GetEnabled: function(){
14847  return this.enabled && this.clientEnabled;
14848 },
14849 Focus: function(){
14850  this.SetFocus();
14851 },
14852 RaiseCheckedChanged: function(){
14853  var processOnServer = this.autoPostBack || this.IsServerEventAssigned("CheckedChanged");
14854  if(!this.CheckedChanged.IsEmpty()){
14855   var args = new ASPxClientProcessingModeEventArgs(processOnServer);
14856   this.CheckedChanged.FireEvent(this, args);
14857   processOnServer = args.processOnServer;
14858  }
14859  return processOnServer;
14860 },
14861 RaiseFocus: function(){
14862  if(!this.GotFocus.IsEmpty()){
14863   var args = new ASPxClientEventArgs();
14864   this.GotFocus.FireEvent(this, args);
14865  }
14866 },
14867 RaiseLostFocus: function(){
14868  if(!this.LostFocus.IsEmpty()){
14869   var args = new ASPxClientEventArgs();
14870   this.LostFocus.FireEvent(this, args);
14871  }
14872 },
14873 RaiseClick: function() {
14874  var processOnServer = this.autoPostBack || this.IsServerEventAssigned("Click");
14875  var cancelEventAndBubble = false;
14876  if(!this.Click.IsEmpty()) {
14877   var args = new ASPxClientButtonClickEventArgs(processOnServer, cancelEventAndBubble);
14878   this.Click.FireEvent(this, args);
14879   cancelEventAndBubble = args.cancelEventAndBubble;
14880   processOnServer = args.processOnServer;
14881  }
14882  return {
14883   processOnServer: processOnServer,
14884   cancelEventAndBubble: cancelEventAndBubble
14885  };
14886 }
14887});
14888ASPxClientButton.Cast = ASPxClientControl.Cast;
14889var ASPxClientButtonClickEventArgs = ASPx.CreateClass(ASPxClientProcessingModeEventArgs, {
14890 constructor: function(processOnServer, cancelEventAndBubble) {
14891  this.constructor.prototype.constructor.call(this, processOnServer);
14892  this.cancelEventAndBubble = cancelEventAndBubble;
14893 }
14894});
14895ASPxClientButton.MakeHiddenElementFocusable = function(element) {
14896 element.__dxHiddenElementState = {
14897  parentDisplay: element.parentNode.style.display,
14898  height: element.style.height,
14899  width: element.style.width
14900 };
14901 element.parentNode.style.display = "block";
14902 element.style.height = "1px";
14903 element.style.width = "1px";
14904};
14905ASPxClientButton.RestoreHiddenElementAppearance = function(element) {
14906 var state = element.__dxHiddenElementState;
14907 element.parentNode.style.display = state.parentDisplay;
14908 element.style.height = state.height;
14909 element.style.width = state.width;
14910 delete element.__dxHiddenElementState;
14911};
14912ASPx.Ident.IsASPxClientButton = function(obj) {
14913 return !!obj.isASPxClientButton;
14914};
14915function _aspxBCallButtonMethod(name, methodName, arg) {
14916 var button = ASPx.GetControlCollection().Get(name); 
14917 if(button != null)
14918  button[methodName](arg);
14919}
14920ASPx.BClick = function(name, evt) {
14921 var button = ASPx.GetControlCollection().Get(name); 
14922 if(button != null)
14923  return button.OnClick(evt);
14924};
14925window.ASPxClientButton = ASPxClientButton;
14926})();
14927

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.