PageSourceSearch

https://agrimatie.nl/DXR.axd?r=1_247,1_138,1_241,1_164,1_141,1_135,1_215,1_217-vOJRv

js agrimatie.nl collected 2026-10-03 21:34:25 UTC 593,020 bytes, 15,941 lines download raw bytes

1var ASPx = {}, dx = {};
2(function () {
3ASPx.EmptyObject = { };
4ASPx.FalseFunction = function() { return false; }
5ASPx.SSLSecureBlankUrl = '/DXR.axd?r=1_0-vOJRv';
6ASPx.EmptyImageUrl = '/DXR.axd?r=1_35-vOJRv';
7ASPx.VersionInfo = 'Version=\'16.2.7.0\', File Version=\'16.2.7.0\', Date Modified=\'25-11-2025 14:14:28\'';
8ASPx.InvalidDimension = -10000;
9ASPx.InvalidPosition = -10000;
10ASPx.AbsoluteLeftPosition = -10000;
11ASPx.EmptyGuid = "00000000-0000-0000-0000-000000000000";
12ASPx.CallbackSeparator = ":";
13ASPx.ItemIndexSeparator = "i";
14ASPx.CallbackResultPrefix = "/*DX*/";
15ASPx.AccessibilityEmptyUrl = "javascript:;";
16ASPx.AccessibilityPronounceTimeout = 500;
17ASPx.PossibleNumberDecimalSeparators = [",", "."];
18ASPx.CultureInfo = {
19 twoDigitYearMax: 2029,
20 ts: ":",
21 ds: "/",
22 am: "AM",
23 pm: "PM",
24 monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ""],
25 genMonthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "
25November", "December", ""],
26 abbrMonthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ""],
27 abbrDayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
28 dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
29 numDecimalPoint: ".",
30 numPrec: 2,
31 numGroupSeparator: ",", 
32 numGroups: [ 3 ],
33 numNegPattern: 1,
34 numPosInf: "Infinity", 
35 numNegInf: "-Infinity", 
36 numNan: "NaN",
37 currency: "$",
38 currDecimalPoint: ".",
39 currPrec: 2,
40 currGroupSeparator: ",",
41 currGroups: [ 3 ],
42 currPosPattern: 0,
43 currNegPattern: 0,
44 percentPattern: 0,
45 shortTime: "h:mm tt",
46 longTime: "h:mm:ss tt",
47 shortDate: "M/d/yyyy",
48 longDate: "dddd, MMMM d, yyyy",
49 monthDay: "MMMM d",
50 yearMonth: "MMMM yyyy"
51};
52ASPx.CultureInfo.genMonthNames = ASPx.CultureInfo.monthNames;
53ASPx.Position = {
54 Left: "Left",
55 Right: "Right",
56 Top: "Top",
57 Bottom: "Bottom"
58};
59var DateUtils = { };
60DateUtils.GetInvariantDateString = function(date) {
61 if(!date)
62  return "01/01/0001";
63 var day = date.getDate();
64 var month = date.getMonth() + 1;
65 var year = date.getFullYear();
66 var result = "";
67 if(month < 10)
68  result += "0";
69 result += month.toString() + "/";
70 if(day < 10)
71  result += "0";
72 result += day.toString() + "/";
73 if(year < 1000)
74  result += "0";
75 result += year.toString();
76 return result;
77}
78DateUtils.GetInvariantDateTimeString = function(date) {
79 var dateTimeString = DateUtils.GetInvariantDateString(date);
80 var time = {
81  h: date.getHours(),
82  m: date.getMinutes(),
83  s: date.getSeconds()
84 };
85 for(var key in time) {
86  var str = time[key].toString();
87  if(str.length < 2)
88   str = "0" + str;
89  time[key] = str;
90 }
91 dateTimeString += " " + time.h + ":" + time.m + ":" + time.s;
92 var msec = date.getMilliseconds();
93 if(msec > 0)
94  dateTimeString += "." + ("000" + msec.toString()).substr(-3);
95 return dateTimeString;
96}
97DateUtils.ExpandTwoDigitYear = function(value) {
98 value += 1900;
99 if(value + 99 < ASPx.CultureInfo.twoDigitYearMax)
100  value += 100;
101 return value;  
102}
103DateUtils.ToUtcTime = function(date) {
104 var result = new Date();
105 result.setTime(date.valueOf() + 60000 * date.getTimezoneOffset());
106 return result;
107}
108DateUtils.ToLocalTime = function(date) {
109 var result = new Date();
110 result.setTime(date.valueOf() - 60000 * date.getTimezoneOffset());
111 return result; 
112}
113DateUtils.AreDatesEqualExact = function(date1, date2) {
114 if(date1 == null && date2 == null)
115  return true;
116 if(date1 == null || date2 == null)
117  return false;
118 return date1.getTime() == date2.getTime(); 
119}
120DateUtils.FixTimezoneGap = function(oldDate, newDate) {
121 var diff = newDate.getHours() - oldDate.getHours();
122 if(diff == 0)
123  return;
124 var sign = (diff == 1 || diff == -23) ? -1 : 1;
125 var trial = new Date(newDate.getTime() + sign * 3600000);
126 var isDateChangedAsExpected = newDate.getHours() - trial.getHours() === diff;
127 if(isDateChangedAsExpected && (sign > 0 || trial.getDate() == newDate.getDate()))
128  newDate.setTime(trial.getTime());
129}
130ASPx.DateUtils = DateUtils;
131var Timer = { };
132Timer.ClearTimer = function(timerID){
133 if(timerID > -1)
134  window.clearTimeout(timerID);
135 return -1;
136}
137Timer.ClearInterval = function(timerID){
138 if(timerID > -1)
139  window.clearInterval(timerID);
140 return -1;
141}
142var setControlBoundTimer = function(handler, control, setTimerFunction, clearTimerFunction, delay) {
143 var timerId;
144 var getTimerId = function() { return timerId };
145 var boundHandler = function() {
146  var controlExists = control && ASPx.GetControlCollection().Get(control.name) === control;
147  if(controlExists)
148   handler.aspxBind(control)();
149  else
150   clearTimerFunction(getTimerId());
151 }
152 timerId = setTimerFunction(boundHandler, delay);
153 return timerId;
154}
155Timer.SetControlBoundTimeout = function(handler, control, delay) {
156 return setControlBoundTimer(handler, control, window.setTimeout, Timer.ClearTimer, delay);
157}
158Timer.SetControlBoundInterval = function(handler, control, delay) {
159 return setControlBoundTimer(handler, control, window.setInterval, Timer.ClearInterval, delay);
160}
161Timer.Throttle = function(func, delay) {
162 var isThrottled = false,
163   savedArgs,
164   savedThis = this;
165 function wrapper() {
166  if(isThrottled) {
167   savedArgs = arguments;
168   savedThis = this;
169   return;
170  }
171  func.apply(this, arguments);
172  isThrottled = true;
173  setTimeout(function() {
174   isThrottled = false;
175   if(savedArgs) {
176    wrapper.apply(savedThis, savedArgs);
177    savedArgs = null;
178   }
179  }, delay);
180 }
181 wrapper.cancel = function() {
182  clearTimeout(delay);
183  delay = savedArgs = savedThis = null;
184 };
185 return wrapper;
186}
187ASPx.Timer = Timer;
188var Browser = { };
189Browser.UserAgent = navigator.userAgent.toLowerCase();
190Browser.Mozilla = false;
191Browser.IE = false;
192Browser.Firefox = false;
193Browser.Netscape = false;
194Browser.Safari = false;
195Browser.Chrome = false;
196Browser.Opera = false;
197Browser.Edge = false;
198Browser.Version = undefined; 
199Browser.MajorVersion = undefined; 
200Browser.WindowsPlatform = false;
201Browser.MacOSPlatform = false;
202Browser.MacOSMobilePlatform = false;
203Browser.AndroidMobilePlatform = false;
204Browser.PlaformMajorVersion = false;
205Browser.WindowsPhonePlatform = false;
206Browser.AndroidDefaultBrowser = false;
207Browser.AndroidChromeBrowser = false;
208Browser.SamsungAndroidDevice = false;
209Browser.WebKitTouchUI = false;
210Browser.MSTouchUI = false;
211Browser.TouchUI = false;
212Browser.WebKitFamily = false; 
213Browser.NetscapeFamily = false; 
214Browser.HardwareAcceleration = false;
215Browser.VirtualKeyboardSupported = false;
216Browser.Info = "";
217function indentPlatformMajorVersion(userAgent) {
218 var regex = /(?:(?:windows nt|macintosh|mac os|cpu os|cpu iphone os|android|windows phone|linux) )(\d+)(?:[-0-9_.])*/;
219 var matches = regex.exec(userAgent);
220 if(matches)
221  Browser.PlaformMajorVersion = matches[1];
222}
223function getIECompatibleVersionString() {
224 if(document.compatible) {
225  for(var i = 0; i < document.compatible.length; i++)
226   if(document.compatible[i].userAgent === "IE" && document.compatible[i].version)
227    return document.compatible[i].version.toLowerCase();
228 }
229 return "";
230}
231Browser.IdentUserAgent = function(userAgent, ignoreDocumentMode) {
232 var browserTypesOrderedList = [ "Mozilla", "IE", "Firefox", "Netscape", "Safari", "Chrome", "Opera", "Opera10", "Edge" ];
233 var defaultBrowserType = "IE";
234 var defaultPlatform = "Win";
235 var defaultVersions = { Safari: 2, Chrome: 0.1, Mozilla: 1.9, Net
235scape: 8, Firefox: 2, Opera: 9, IE: 6, Edge: 12 };
236 if(!userAgent || userAgent.length == 0) {
237  fillUserAgentInfo(browserTypesOrderedList, defaultBrowserType, defaultVersions[defaultBrowserType], defaultPlatform);
238  return;
239 }
240 userAgent = userAgent.toLowerCase();
241 indentPlatformMajorVersion(userAgent);
242 try {
243  var platformIdentStrings = {
244   "Windows": "Win",
245   "Macintosh": "Mac",
246   "Mac OS": "Mac",
247   "Mac_PowerPC": "Mac",
248   "cpu os": "MacMobile",
249   "cpu iphone os": "MacMobile",
250   "Android": "Android",
251   "!Windows Phone": "WinPhone",
252   "!WPDesktop": "WinPhone",
253   "!ZuneWP": "WinPhone"
254  };
255  var optSlashOrSpace = "(?:/|\\s*)?";
256  var version = "(\\d+)(?:\\.((?:\\d+?[1-9])|\\d)0*?)?";
257  var optVersion = "(?:" + version + ")?";
258  var patterns = {
259   Safari: "applewebkit(?:.*?(?:version/" + version + "[\\.\\w\\d]*?(?:\\s+mobile\/\\S*)?\\s+safari))?",
260   Chrome: "(?:chrome|crios)(?!frame)" + optSlashOrSpace + optVersion,
261   Mozilla: "mozilla(?:.*rv:" + optVersion + ".*Gecko)?",
262   Netscape: "(?:netscape|navigator)\\d*/?\\s*" + optVersion,
263   Firefox: "firefox" + optSlashOrSpace + optVersion,
264   Opera: "(?:opera|opr)" + optSlashOrSpace + optVersion,
265   Opera10: "opera.*\\s*version" + optSlashOrSpace + optVersion,
266   IE: "msie\\s*" + optVersion,
267   Edge: "edge" + optSlashOrSpace + optVersion
268  };
269  var browserType;
270  var version = -1;
271  for(var i = 0; i < browserTypesOrderedList.length; i++) {
272   var browserTypeCandidate = browserTypesOrderedList[i];
273   var regExp = new RegExp(patterns[browserTypeCandidate], "i");
274   if(regExp.compile)
275    regExp.compile(patterns[browserTypeCandidate], "i");
276   var matches = regExp.exec(userAgent);
277   if(matches && matches.index >= 0) {
278    if(browserType == "IE" && version >= 11 && browserTypeCandidate == "Safari") 
279     continue;
280    browserType = browserTypeCandidate;
281    if(browserType == "Opera10")
282     browserType = "Opera";
283    var tridentPattern = "trident" + optSlashOrSpace + optVersion;
284    version = Browser.GetBrowserVersion(userAgent, matches, tridentPattern, getIECompatibleVersionString());
285    if(browserType == "Mozilla" && version >= 11)
286     browserType = "IE";
287   }
288  }
289  if(!browserType)
290   browserType = defaultBrowserType;
291  var browserVersionDetected = version != -1;
292  if(!browserVersionDetected)
293   version = defaultVersions[browserType];
294  var platform;
295  var minOccurenceIndex = Number.MAX_VALUE;
296  for(var identStr in platformIdentStrings) {
297   if(!platformIdentStrings.hasOwnProperty(identStr)) continue;
298   var importantIdent = identStr.substr(0,1) == "!";
299   var occurenceIndex = userAgent.indexOf((importantIdent ? identStr.substr(1) : identStr).toLowerCase());
300   if(occurenceIndex >= 0 && (occurenceIndex < minOccurenceIndex || importantIdent)) {
301    minOccurenceIndex = importantIdent ? 0 : occurenceIndex;
302    platform = platformIdentStrings[identStr];
303   }
304  }
305  var samsungPattern = "SM-[A-Z]";
306  var matches = userAgent.toUpperCase().match(samsungPattern);
307  var isSamsungAndroidDevice = matches && matches.length > 0;
308  if(platform == "WinPhone" && version < 9)
309   version = Math.floor(getVersionFromTrident(userAgent, "trident" + optSlashOrSpace + optVersion));
310  if(!ignoreDocumentMode && browserType == "IE" && version > 7 && document.documentMode < version)
311   version = document.documentMode;
312  if(platform == "WinPhone")
313   version = Math.max(9, version);
314  if(!platform)
315   platform = defaultPlatform;
316  if(platform == platformIdentStrings["cpu os"] && !browserVersionDetected) 
317   version = 4;
318  fillUserAgentInfo(browserTypesOrderedList, browserType, version, platform, isSamsungAndroidDevice);
319 } catch(e) {
320  fillUserAgentInfo(browserTypesOrderedList, defaultBrowserType, defaultVersions[defaultBrowserType], defaultPlatform);
321 }
322}
323function getVersionFromMatches(matches) {
324 var result = -1;
325 var versionStr = "";
326 if(matches[1]) {
327  versionStr += matches[1];
328  if(matches[2])
329   versionStr += "." + matches[2];
330 }
331 if(versionStr != "") {
332  result = parseFloat(versionStr);
333  if(result == NaN)
334   result = -1;
335 }
336 return result;
337}
338function getVersionFromTrident(userAgent, tridentPattern) {
339 var tridentDiffFromVersion = 4;
340 var matches = new RegExp(tridentPattern, "i").exec(userAgent);
341 return getVersionFromMatches(matches) + tridentDiffFromVersion;
342}
343Browser.GetBrowserVersion = function(userAgent, matches, tridentPattern, ieCompatibleVersionString) {
344 var version = getVersionFromMatches(matches);
345 if(ieCompatibleVersionString) {
346  var versionFromTrident = getVersionFromTrident(userAgent, tridentPattern);
347  if(ieCompatibleVersionString === "edge" || parseInt(ieCompatibleVersionString) === versionFromTrident)
348   return versionFromTrident;
349 }
350 return version;
351}
352function fillUserAgentInfo(browserTypesOrderedList, browserType, version, platform, isSamsungAndroidDevice) {
353 for(var i = 0; i < browserTypesOrderedList.length; i++) {
354  var type = browserTypesOrderedList[i];
355  Browser[type] = type == browserType;
356 }
357 Browser.Version = Math.floor(10.0 * version) / 10.0;
358 Browser.MajorVersion = Math.floor(Browser.Version);
359 Browser.WindowsPlatform = platform == "Win" || platform == "WinPhone";
360 Browser.MacOSPlatform = platform == "Mac";
361 Browser.MacOSMobilePlatform = platform == "MacMobile";
362 Browser.AndroidMobilePlatform = platform == "Android";
363 Browser.WindowsPhonePlatform = platform == "WinPhone";
364 Browser.WebKitFamily = Browser.Safari || Browser.Chrome || Browser.Opera && Browser.MajorVersion >= 15;
365 Browser.NetscapeFamily = Browser.Netscape || Browser.Mozilla || Browser.Firefox;
366 Browser.HardwareAcceleration = (Browser.IE && Browser.MajorVersion >= 9) || (Browser.Firefox && Browser.MajorVersion >= 4) || 
367  (Browser.AndroidMobilePlatform && Browser.Chrome) || (Browser.Chrome && Browser.MajorVersion >= 37) || 
368  (Browser.Safari && !Browser.WindowsPlatform) || Browser.Edge;
369 Browser.WebKitTouchUI = Browser.MacOSMobilePlatform || Browser.AndroidMobilePlatform;
370 var isIETouchUI = Browser.IE && Browser.MajorVersion > 9 && Browser.WindowsPlatform && Browser.UserAgent.toLowerCase().indexOf("touch") >= 0;
371 Browser.MSTouchUI = isIETouchUI || (Browser.Edge && !!window.navigator.maxTouchPoints);
372 Browser.TouchUI = Browser.WebKitTouchUI || Browser.MSTouchUI;
373 Browser.MobileUI = Browser.WebKitTouchUI || Browser.WindowsPhonePlatform;
374 Browser.AndroidDefaultBrowser = Browser.AndroidMobilePlatform && !Browser.Chrome;
375 Browser.AndroidChromeBrowser = Browser.AndroidMobilePlatform && Browser.Chrome;
376 if(isSamsungAndroidDevice)
377  Browser.SamsungAndroidDevice = isSamsungAndroidDevice;
378 if(Browser.MSTouchUI) {
379  var isARMArchitecture = Browser.UserAgent.toLowerCase().indexOf("arm;") > -1;    
380  Browser.VirtualKeyboardSupported = isARMArchitecture || Browser.WindowsPhonePlatform;   
381 } else {
382  Browser.VirtualKeyboardSupported = Browser.WebKitTouchUI;
383 }
384 fillDocumentElementBrowserTypeClassNames(browserTypesOrderedList);
385}
386function fillDocumentElementBrowserTypeClassNames(browserTypesOrderedList) {
387 var documentElementClassName = "";
388 var browserTypeslist = browserTypesOrderedList.concat(["WindowsPlatform", "MacOSPlatform", "MacOSMobilePlatform", "AndroidMobilePlatform",
389   "WindowsPhonePlatform", "WebKitFamily", "WebKitTouchUI", "MSTouchUI", "TouchUI", "AndroidDefaultBrowser"]);
390 for(var i = 0; i < browserTypeslist.length; i++) {
391  var type = browserTypeslist[i];
392  if(Browser[type])
393   documentElementClassName += "dx" + type + " ";
394 }
395 documentElementClassName += "dxBrowserVersion-" + Browser.MajorVersion
396 if(document && document.documentElement) {
397  if(document.documentElement.className != "")
398   documentElementClassName = " " + documentElementClassName;
399  document.documentElement.className += documentElementClassName;
400  Browser.Info = documentElementClassName;
401 }
402}
403Browser.IdentUserAgent(Browser.UserAgent);
404ASPx.Browser = Browser;
405ASPx.BlankUrl = Browser.IE ? ASPx.SSLSecureBlankUrl : (Browser.Opera ? "about:blank" : "");
406var Data = { };
407Data.ArrayInsert = function(array, element, position){
408 if(0 <= position && position < array.length){
409  for(var i = array.length; i > position; i --)
410   array[i] = array[i - 1];
411  array[position] = element;
412 }
413 else
414  array.push(element);
415}
416Data.ArrayRemove = function(array, element){
417 var index = Data.ArrayIndexOf(array, element);
418 if(index > -1) Data.ArrayRemoveAt(array, index);
419}
420Data.ArrayRemoveAt = function(array, index){
421 if(index >= 0  && index < array.length){
422  for(var i = index; i < array.length - 1; i++)
423   array[i] = array[i + 1];
424  array.pop();
425 }
426}
427Data.ArrayClear = function(array){
428 while(array.length > 0)
429  array.pop();
430}
431Data.ArrayIndexOf = function(array, element, comparer) {
432 if(!comparer) {
433  for(var i = 0; i < array.length; i++) {
434   if(array[i] == element)
435    return i;
436  }
437 } else {
438  for(var i = 0; i < array.length; i++) {
439   if(comparer(array[i], element))
440    return i;
441  }
442 }
443 return -1;
444}
445Data.ArrayContains = function(array, element) { 
446 return Data.ArrayIndexOf(array, element) >= 0;
447}
448Data.ArrayEqual = function(array1, array2) {
449 var count1 = array1.length;
450 var count2 = array2.length;
451 if(count1 != count2)
452  return false;
453 for(var i = 0; i < count1; i++)
454  if(array1[i] != array2[i])
455   return false;
456 return true;
457}
458Data.ArraySame = function(array1, array2) {
459 if(array1.length !== array2.length)
460  return false;
461 return array1.every(function(elem) { return Data.ArrayContains(array2, elem) });
462}
463Data.ArrayGetIntegerEdgeValues = function(array) {
464 var arrayToSort = Data.CollectionToArray(array);
465 Data.ArrayIntegerAscendingSort(arrayToSort);
466 return {
467  start: arrayToSort[0],
468  end: arrayToSort[arrayToSort.length - 1]
469 }
470}
471Data.ArrayIntegerAscendingSort = function(array){
472 Data.ArrayIntegerSort(array);
473}
474Data.ArrayIntegerSort = function(array, desc) {
475 array.sort(function(i1, i2) {
476  var res = 0;
477  if(i1 > i2)
478   res = 1;
479  else if(i1 < i2)
480   res = -1;
481  if(desc)
482   res *= -1;
483  return res;
484 });
485},
486Data.CollectionsUnionToArray = function(firstCollection, secondCollection) {
487 var result = [];
488 var firstCollectionLength = firstCollection.length;
489 var secondCollectionLength = secondCollection.length;
490 for(var i = 0; i <  firstCollectionLength + secondCollectionLength; i++) {
491  if(i < firstCollectionLength) 
492   result.push(firstCollection[i]);
493  else 
494   result.push(secondCollection[i - firstCollectionLength]);
495 }  
496 return result;
497}
498Data.CollectionToArray = function(collection) {
499 var array = [];
500 for(var i = 0; i < collection.length; i++)
501  array.push(collection[i]);
502 return array;
503}
504Data.CreateHashTableFromArray = function(array) {
505 var hash = [];
506 for(var i = 0; i < array.length; i++)
507  hash[array[i]] = 1;
508 return hash;
509}
510Data.CreateIndexHashTableFromArray = function(array) {
511 var hash = [];
512 for(var i = 0; i < array.length; i++)
513  hash[array[i]] = i;
514 return hash;
515}
516Data.ArrayToHash = function(array, getKeyFunc, getValueFunc) {
517 if(!(array instanceof Array)) 
518  return { };
519 return array.reduce(function(map, element, index) { 
520  var key = getKeyFunc(element, index);
521  var value = getValueFunc(element, index);
522  map[key] = value;
523  return map; 
524 }, { });
525}
526var defaultBinarySearchComparer = function(array, index, value) {
527 var arrayElement = array[index];
528 if(arrayElement == value)
529  return 0;
530 else
531  return arrayElement < value ? -1 : 1;
532};
533Data.NearestLeftBinarySearchComparer = function(array, index, value) { 
534 var arrayElement = array[index];
535 var leftPoint = arrayElement < value;
536 var lastLeftPoint = leftPoint && index == array.length - 1;
537 var nearestLeftPoint = lastLeftPoint || (leftPoint && array[index + 1] >= value)
538 if(nearestLeftPoint)
539  return 0;
540 else
541  return arrayElement < value ? -1 : 1;
542};
543Data.ArrayBinarySearch = function(array, value, binarySearchComparer, startIndex, length) {
544 if(!binarySearchComparer)
545  binarySearchComparer = defaultBinarySearchComparer;
546 if(!ASPx.IsExists(startIndex))
547  startIndex = 0;
548 if(!ASPx.IsExists(length))
549  length = array.length - startIndex;  
550 var endIndex = (startIndex + length) - 1;
551 while(startIndex <= endIndex) {
552  var middle =  (startIndex + ((endIndex - startIndex) >> 1));
553  var compareResult = binarySearchComparer(array, middle, value);
554  if(compareResult == 0)
555   return middle;
556  if(compareResult < 0)
557   startIndex = middle + 1;
558  else
559   endIndex = middle - 1;
560 }
561 return -(startIndex + 1);
562},
563Data.ArrayFlatten = function(arrayOfArrays) {
564 return [].concat.apply([], arrayOfArrays);
565},
566Data.GetDistinctArray = function(array) {
567 var resultArray = [];
568 for(var i = 0; i < array.length; i++) {
569  var currentEntry = array[i];
570  if(Data.ArrayIndexOf(resultArray, currentEntry) == -1) {
571     resultArray.push(currentEntry);
572  }
573 }
574 return resultArray;
575}
576Data.ForEach = function(arr, callback) {
577 if(Array.prototype.forEach) {
578  Array.prototype.forEach.call(arr, callback);
579 } else {
580  for(var i = 0, len = arr.length; i < len; i++) {
581   callback(arr[i], i, arr);
582  }
583 }
584},
585Data.MergeHashTables = function(target, object) {
586 if(!object || typeof (object) == "string")
587  return target;
588 if(!target)
589  target = {};
590 for(var key in object)
591  if(key && !(key in target))
592   target[key] = object[key];
593 return target;
594}
595Data.Range = function(count, start) {
596 count = parseInt(count) || 0;
597 start = parseInt(start) || 0;
598 if(count < 0) count = 0;
599 if(start < 0) start = 0;
600 return Array.apply(null, Array(count)).map(function(val, i) { return start + i; });
601}
602ASPx.Data = Data;
603var Cookie = { };
604Cookie.DelCookie = function(name){
605 setCookieInternal(name, "", new Date(1970, 1, 1));
606}
607Cookie.GetCookie = function(name) {
608 name = escape(name);
609 var cookies = document.cookie.split(';');
610 for(var i = 0; i < cookies.length; i++) {
611  var cookie = Str.Trim(cookies[i]);
612  if(cookie.indexOf(name + "=") == 0)
613   return unescape(cookie.substring(name.length + 1, cookie.length));
614  else if(cookie.indexOf(name + ";") == 0 || cookie === name)
615   return "";
616 }
617 return null;
618}
619Cookie.SetCookie = function(name, value, expirationDate){
620 if(!ASPx.IsExists(value)) {
621  Cookie.DelCookie(name);
622  return;
623 }
624 if(!ASPx.Ident.IsDate(expirationDate)) {
625  expirationDate = new Date();
626  expirationDate.setFullYear(expirationDate.getFullYear() + 1);
627 }
628 setCookieInternal(name, value, expirationDate);
629}
630function setCookieInternal(name, value, date){
631 document.cookie = escape(name) + "=" + escape(value.toString()) + "; expires=" + date.toGMTString() + "; path=/";
632}
633ASPx.Cookie = Cookie;
634ASPx.ImageUtils = {
635 GetImageSrc: function (image){
636  return image.src;
637 },
638 SetImageSrc: function(image, src){
639  if(isSourceResetRequired())
640   image.src = "";
641  image.src = src;
642 },
643 SetSize: function(image, width, height){
644  image.style.width = width + "px";
645  image.style.height = height + "px";
646 },
647 GetSize: function(image, isWidth){
648  return (isWidth ? image.offsetWidth : image.offsetHeight);
649 }
650};
651var Str = { };
652Str.ApplyReplacement = function(text, replecementTable) {
653 if(typeof(text) != "string")
654  text = text.toString();
655 for(var i = 0; i < replecementTable.length; i++) {
656  var replacement = replecementTable[i];
657  text = text.replace(replacement[0], replacement[1]);
658 }
659 return text;
660}
661Str.CompleteReplace = function(text, regexp, newSubStr) {
662 if(typeof(text) != "string")
663  text = text.toString();
664 var textPrev;
665 do {
666  textPrev = text;
667  text = text.replace(regexp, newSubStr);
668 } while(text != textPrev);
669 return text;
670}
671Str.EncodeHtml = function(html) {
672 return Str.ApplyReplacement(html, [
673  [ /&amp;/g,  '&ampx;'  ], [ /&/g, '&amp;'  ],
674  [ /&quot;/g, '&quotx;' ], [ /"/g, '&quot;' ],
675  [ /&lt;/g,   '&ltx;'   ], [ /</g, '&lt;'   ],
676  [ /&gt;/g,   '&gtx;'   ], [ />/g, '&gt;'   ]
677 ]);
678}
679Str.DecodeHtml = function(html) {
680 return Str.ApplyReplacement(html, [
681  [ /&gt;/g,   '>' ], [ /&gtx;/g,  '&gt;'   ],
682  [ /&lt;/g,   '<' ], [ /&ltx;/g,  '&lt;'   ],
683  [ /&quot;/g, '"' ], [ /&quotx;/g,'&quot;' ],
684  [ /&amp;/g,  '&' ], [ /&ampx;/g, '&amp;'  ]
685 ]);
686}
687Str.TrimStart = function(str) { 
688 return trimInternal(str, true);
689}
690Str.TrimEnd = function(str) { 
691 return trimInternal(str, false, true);
692}
693Str.Trim = function(str) { 
694 return trimInternal(str, true, true); 
695}
696var whiteSpaces = { 
697 0x0009: 1, 0x000a: 1, 0x000b: 1, 0x000c: 1, 0x000d: 1, 0x0020: 1, 0x0085: 1, 
698 0x00a0: 1, 0x1680: 1, 0x180e: 1, 0x2000: 1, 0x2001: 1, 0x2002: 1, 0x2003: 1, 
699 0x2004: 1, 0x2005: 1, 0x2006: 1, 0x2007: 1, 0x2008: 1, 0x2009: 1, 0x200a: 1, 
700 0x200b: 1, 0x2028: 1, 0x2029: 1, 0x202f: 1, 0x205f: 1, 0x3000: 1
701};
702var caretWidth = 1;
703function trimInternal(source, trimStart, trimEnd) {
704 var len = source.length;
705 if(!len)
706  return source;
707 if(len < 0xBABA1) { 
708  var result = source;
709  if(trimStart) {
710   result = result.replace(/^\s+/, "");
711  }
712  if(trimEnd) {
713   result = result.replace(/\s+$/, "");
714  }
715  return result;  
716 } else {
717  var start = 0;
718  if(trimEnd) {   
719   while(len > 0 && whiteSpaces[source.charCodeAt(len - 1)]) {
720    len--;
721   }
722  }
723  if(trimStart && len > 0) {
724   while(start < len && whiteSpaces[source.charCodeAt(start)]) { 
725    start++; 
726   }   
727  }
728  return source.substring(start, len);
729 }
730}
731Str.Insert = function(str, subStr, index) { 
732 var leftText = str.slice(0, index);
733 var rightText = str.slice(index);
734 return leftText + subStr + rightText;
735}
736Str.InsertEx = function(str, subStr, startIndex, endIndex) { 
737 var leftText = str.slice(0, startIndex);
738 var rightText = str.slice(endIndex);
739 return leftText + subStr + rightText;
740}
741var greekSLFSigmaChar = String.fromCharCode(962);
742var greekSLSigmaChar = String.fromCharCode(963);
743Str.PrepareStringForFilter = function(s){
744 s = s.toLowerCase();
745 if(ASPx.Browser.WebKitFamily) {
746  return s.replace(new RegExp(greekSLFSigmaChar, "g"), greekSLSigmaChar);
747 }
748 return s;
749}
750Str.GetCoincideCharCount = function(text, filter, textMatchingDelegate) {
751 var coincideText = ASPx.Str.PrepareStringForFilter(filter);
752 var originText = ASPx.Str.PrepareStringForFilter(text);
753 while(coincideText != "" && !textMatchingDelegate(originText, coincideText)) {
754  coincideText = coincideText.slice(0, -1);
755 }
756 return coincideText.length;
757}
758ASPx.Str = Str;
759var Xml = { };
760Xml.Parse = function(xmlStr) {
761 if(window.DOMParser) {
762  var parser = new DOMParser();
763  return parser.parseFromString(xmlStr, "text/xml");
764 }
765 else if(window.ActiveXObject) {
766  var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
767  if(xmlDoc) {
768   xmlDoc.async = false;
769   xmlDoc.loadXML(xmlStr);
770   return xmlDoc;
771  }
772 }
773 return null;
774}
775ASPx.Xml = Xml;
776ASPx.Key = {
777 F1     : 112,
778 F2     : 113,
779 F3     : 114,
780 F4     : 115,
781 F5     : 116,
782 F6     : 117,
783 F7     : 118,
784 F8     : 119,
785 F9     : 120,
786 F10    : 121,
787 F11    : 122,
788 F12    : 123,
789 Ctrl   : 17,
790 Shift  : 16,
791 Alt    : 18,
792 Enter  : 13,
793 Home   : 36,
794 End    : 35,
795 Left   : 37,
796 Right  : 39,
797 Up     : 38,
798 Down   : 40,
799 PageUp    : 33,
800 PageDown  : 34,
801 Esc    : 27,
802 Space  : 32,
803 Tab    : 9,
804 Backspace : 8,
805 Delete    : 46,
806 Insert    : 45,
807 ContextMenu  : 93,
808 Windows   : 91,
809 Decimal   : 110
810};
811ASPx.KeyCode = {
812 Backspace : 8,
813 Tab    : 9,
814 Enter  : 13,
815 Pause  : 19,
816 CapsLock  : 20,
817 Esc    : 27,
818 Space  : 32,
819 PageUp    : 33,
820 PageDown  : 34,
821 End    : 35,
822 Home   : 36,
823 Left   : 37,
824 Up     : 38,
825 Right  : 39,
826 Down   : 40,
827 Insert    : 45,
828 Delete    : 46,
829 Key_0  : 48,
830 Key_1  : 49,
831 Key_2  : 50,
832 Key_3  : 51,
833 Key_4  : 52,
834 Key_5  : 53,
835 Key_6  : 54,
836 Key_7  : 55,
837 Key_8  : 56,
838 Key_9  : 57,
839 Key_a  : 65,
840 Key_b  : 66,
841 Key_c  : 67,
842 Key_d  : 68,
843 Key_e  : 69,
844 Key_f  : 70,
845 Key_g  : 71,
846 Key_h  : 72,
847 Key_i  : 73,
848 Key_j  : 74,
849 Key_k  : 75,
850 Key_l  : 76,
851 Key_m  : 77,
852 Key_n  : 78,
853 Key_o  : 79,
854 Key_p  : 80,
855 Key_q  : 81,
856 Key_r  : 82,
857 Key_s  : 83,
858 Key_t  : 84,
859 Key_u  : 85,
860 Key_v  : 86,
861 Key_w  : 87,
862 Key_x  : 88,
863 Key_y  : 89,
864 Key_z  : 90,
865 Windows   : 91,
866 ContextMenu  : 93,
867 Numpad_0  : 96,
868 Numpad_1  : 97,
869 Numpad_2  : 98,
870 Numpad_3  : 99,
871 Numpad_4  : 100,
872 Numpad_5  : 101,
873 Numpad_6  : 102,
874 Numpad_7  : 103,
875 Numpad_8  : 104,
876 Numpad_9  : 105,
877 Multiply  : 106,
878 Add    : 107,
879 Subtract  : 109,
880 Decimal   : 110,
881 Divide    : 111,
882 F1     : 112,
883 F2     : 113,
884 F3     : 114,
885 F4     : 115,
886 F5     : 116,
887 F6     : 117,
888 F7     : 118,
889 F8     : 119,
890 F9     : 120,
891 F10    : 121,
892 F11    : 122,
893 F12    : 123,
894 NumLock   : 144,
895 ScrollLock   : 145,
896 Semicolon : 186,
897 Equals    : 187,
898 Comma  : 188,
899 Dash   : 189,
900 Period    : 190,
901 ForwardSlash : 191,
902 GraveAccent  : 192,
903 OpenBracket  : 219,
904 BackSlash : 220,
905 CloseBracket : 221,
906 SingleQuote  : 222
907};
908ASPx.ScrollBarMode = { Hidden: 0, Visible: 1, Auto: 2 };
909ASPx.ColumnResizeMode = { None: 0, Control: 1, NextColumn: 2 };
910var Selection = { };
911Selection.Set = function(input, startPos, endPos, scrollToSelection) {
912 if(!ASPx.IsExistsElement(input))
913  return;
914 if(Browser.VirtualKeyboardSupported && (ASPx.GetActiveElement() !== input || ASPx.VirtualKeyboardUI.getInputNativeFocusLocked()))
915  return;
916 var textLen = input.value.length;
917 startPos = ASPx.GetDefinedValue(startPos, 0);
918 endPos = ASPx.GetDefinedValue(endPos, textLen);
919 if(startPos < 0)
920  startPos = 0;
921 if(endPos < 0 || endPos > textLen)
922  endPos = textLen;
923 if(startPos > endPos)
924  startPos = endPos;
925 var makeReadOnly = false;
926 if(Browser.WebKitFamily && input.readOnly) {
927  input.readOnly = false;
928  makeReadOnly = true;
929 }
930 try {
931  if(Browser.Firefox && Browser.Version >= 8) 
932   input.setSelectionRange(startPos, endPos, "backward");
933  else if(Browser.IE && input.createTextRange) {
934   var range = input.createTextRange();
935   range.collapse(true);
936   range.moveStart("character", startPos);
937   range.moveEnd("character", endPos - startPos);
938   range.select();
939  } else {
940   forceScrollToSelectionRange(input, startPos, endPos);
941   input.setSelectionRange(startPos, endPos);
942  }
943  if(Browser.Opera || Browser.Firefox || Browser.Chrome) 
944   input.focus();
945 } catch(e) { 
946 }
947 if(scrollToSelection && input.tagName == 'TEXTAREA') {
948  var scrollHeight = input.scrollHeight;
949  var approxCaretPos = startPos;
950  var scrollTop = Math.max(Math.round(approxCaretPos * scrollHeight / textLen  - input.clientHeight / 2), 0);
951  input.scrollTop = scrollTop;
952 }
953 if(makeReadOnly)
954  input.readOnly = true;
955}
956var getTextWidthBeforePos = function(input, pos) {
957 return ASPx.GetSizeOfText(input.value.toString().substr(0, pos), ASPx.GetCurrentStyle(input)).width;
958}
959var forceScrollToSelectionRange = function(input, startPos, endPos) {
960 var widthBeforeStartPos = getTextWidthBeforePos(input, startPos) - caretWidth;
961 var widthBeforeEndPos = getTextWidthBeforePos(input, endPos) + caretWidth;
962 var inputRawWidth = input.offsetWidth - ASPx.GetLeftRightBordersAndPaddingsSummaryValue(input);
963 if(input.scrollLeft < widthBeforeEndPos - inputRawWidth)
964  input.scrollLeft = widthBeforeEndPos - inputRawWidth;
965 else if(input.scrollLeft > widthBeforeStartPos)
966  input.scrollLeft = widthBeforeStartPos;
967}
968Selection.GetInfo = function(input) {
969 var start, end;
970 if(Browser.IE && Browser.Version < 9) {
971  var range = document.selection.createRange();
972  var rangeCopy = range.duplicate();
973  range.move('character', -input.value.length);
974  range.setEndPoint('EndToStart', rangeCopy);
975  start = range.text.length;
976  end = start + rangeCopy.text.length;
977 } else {
978  try {
979   start = input.selectionStart;
980   end = input.selectionEnd;
981  } catch (e) {
982  }
983 }
984 return { startPos: start, endPos: end };
985}
986Selection.GetExtInfo = function(input) {
987 var start = 0, end = 0, textLen = 0;
988 if(Browser.IE && Browser.Version < 9) {
989  var normalizedValue;
990  var range, textInputRange, textInputEndRange;
991  range = document.selection.createRange();
992  if(range && range.parentElement() == input) {
993   textLen = input.value.length;
994   normalizedValue = input.value.replace(/\r\n/g, "\n");
995   textInputRange = input.createTextRange();
996   textInputRange.moveToBookmark(range.getBookmark());
997   textInputEndRange = input.createTextRange();
998   textInputEndRange.collapse(false);
999   if(textInputRange.compareEndPoints("StartToEnd", textInputEndRange) > -1) {
1000    start = textLen;
1001    end = textLen;
1002   } else {
1003    start = normalizedValue.slice(0, start).split("\n").length - textInputRange.moveStart("character", -textLen) -1;
1004    if(textInputRange.compareEndPoints("EndToEnd", textInputEndRange) > -1)
1005     end = textLen;
1006    else
1007     end = normalizedValue.slice(0, end).split("\n").length - textInputRange.moveEnd("character", -textLen) - 1;    
1008   }
1009  }
1010  return {startPos: start, endPos: end};
1011 }
1012 try {
1013  start = input.selectionStart;
1014  end = input.selectionEnd;
1015 } catch (e) {
1016 }
1017 return {startPos: start, endPos: end}; 
1018}
1019Selection.SetCaretPosition = function(input, caretPos) {
1020 if(typeof caretPos === "undefined" || caretPos < 0)
1021  caretPos = input.value.length;
1022 Selection.Set(input, caretPos, caretPos, true);
1023}
1024Selection.GetCaretPosition = function(element, isDialogMode) {
1025 var pos = 0;
1026 if("selectionStart" in element) {
1027  pos = element.selectionStart;
1028 } else if("selection" in document) {
1029  element.focus();
1030  var sel = document.selection.createRange(),
1031   selLength = document.selection.createRange().text.length;
1032  sel.moveStart("character", -element.value.length);
1033  pos = sel.text.length - selLength;
1034 }
1035 if(isDialogMode && !pos) {
1036  pos = element.value.length - 1;
1037 }
1038 return pos;
1039}
1040Selection.Clear = function() {
1041 try {
1042  if(window.getSelection) {
1043   window.getSelection().removeAllRanges();
1044  }
1045  else if(document.selection) {
1046   if(document.selection.empty)
1047    document.selection.empty();
1048   else if(document.selection.clear)
1049    document.selection.clear();
1050  }
1051 } catch(e) {
1052 }
1053}
1054Selection.ClearOnMouseMove = function(evt) {
1055 if(!Browser.IE || (evt.button != 0)) 
1056  Selection.Clear();
1057}
1058Selection.SetElementSelectionEnabled = function(element, value) {
1059 var userSelectValue = value ? "" : "none";
1060 var func = value ? Evt.DetachEventFromElement : Evt.AttachEventToElement;
1061 if(Browser.Firefox)
1062  element.style.MozUserSelect = userSelectValue;
1063 else if(Browser.WebKitFamily)
1064  element.style.webkitUserSelect = userSelectValue;
1065 else if(Browser.Opera)
1066  func(element, "mousemove", Selection.Clear);
1067 else {
1068  func(element, "selectstart", ASPx.FalseFunction);
1069  func(element, "mousemove", Selection.Clear);
1070 }
1071}
1072Selection.SetElementAsUnselectable = function(element, isWithChild, recursive) {
1073 if(element && element.nodeType == 1) {
1074  element.unselectable = "on";
1075  if(Browser.NetscapeFamily)
1076   element.onmousedown = ASPx.FalseFunction;
1077  if((Browser.IE && Browser.Version >= 9) || Browser.WebKitFamily)
1078   Evt.AttachEventToElement(element, "mousedown", Evt.PreventEventAndBubble);
1079  if(isWithChild === true){
1080   for(var j = 0; j < element.childNodes.length; j ++)
1081    Selection.SetElementAsUnselectable(element.childNodes[j], (!!recursive ? true : false), (!!recursive));
1082  }
1083 }
1084}
1085Selection.AreEqual = function(selection1, selection2) {
1086 return selection1.startPos === selection2.startPos && selection1.endPos === selection2.endPos;
1087}
1088ASPx.Selection = Selection;
1089var MouseScroller = { };
1090MouseScroller.MinimumOffset = 10;
1091MouseScroller.Create = function(getElement, getScrollXElement, getScrollYElement, needPreventScrolling, vertRecursive, onMouseDown, onMouseMove, onMouseUp, onMouseUpMissed) {
1092 var element = getElement();
1093 if(!element) 
1094  return;
1095 if(!element.dxMouseScroller)
1096  element.dxMouseScroller = new MouseScroller.Extender(getElement, getScrollXElement, getScrollYElement, needPreventScrolling, vertRecursive, onMouseDown, onMouseMove, onMouseUp, onMouseUpMissed);
1097 return element.dxMouseScroller;
1098}
1099MouseScroller.Extender = function(getElement, getScrollXElement, getScrollYElement, needPreventScrolling, vertRecursive, onMouseDown, onMouseMove, onMouseUp, onMouseUpMissed) {
1100 this.getElement = getElement;
1101 this.getScrollXElement = getScrollXElement;
1102 this.getScrollYElement = getScrollYElement;
1103 this.needPreventScrolling = needPreventScrolling;
1104 this.vertRecursive = !!vertRecursive;
1105 this.createHandlers(onMouseDown || function() { }, onMouseMove || function() { }, onMouseUp || function() { }, onMouseUpMissed || function() { });
1106 this.update()
1107};
1108MouseScroller.Extender.prototype = {
1109 update: function() {
1110  if(this.element)
1111   Evt.DetachEventFromElement(this.element, ASPx.TouchUIHelper.touchMouseDownEventName, this.mouseDownHandler);
1112  this.element = this.getElement();
1113  Evt.AttachEventToElement(this.element, ASPx.TouchUIHelper.touchMouseDownEventName, this.mouseDownHandler);  
1114  Evt.AttachEventToElement(this.element, "click", this.mouseClickHandler);   
1115  if(Browser.MSTouchUI && this.element.className.indexOf(ASPx.TouchUIHelper.msTouchDraggableClassName) < 0)
1116   this.element.className += " " + ASPx.TouchUIHelper.msTouchDraggableClassName;
1117  this.scrollXElement = this.getScrollXElement();
1118  this.scrollYElement = this.getScrollYElement();
1119 },
1120 createHandlers: function(onMouseDown, onMouseMove, onMouseUp, onMouseUpMissed) {
1121  var mouseDownCounter = 0;
1122  this.onMouseDown = onMouseDown;
1123  this.onMouseMove = onMouseMove;
1124  this.onMouseUp = onMouseUp;  
1125  this.mouseDownHandler = function(e) {
1126   if(mouseDownCounter++ > 0) {
1127    this.finishScrolling();
1128    onMouseUpMissed();
1129   }
1130   var eventSource = Evt.GetEventSource(e);
1131   var requirePreventCustonScroll = ASPx.IsExists(ASPx.TouchUIHelper.RequirePreventCustomScroll) && ASPx.TouchUIHelper.RequirePreventCustomScroll(eventSource, this.element);
1132   if(requirePreventCustonScroll || this.needPreventScrolling && this.needPreventScrolling(eventSource))
1133    return;
1134   this.scrollableTreeLine = this.GetScrollableElements();
1135   this.firstX = this.prevX = Evt.GetEventX(e);
1136   this.firstY = this.prevY = Evt.GetEventY(e);
1137   Evt.AttachEventToDocument(ASPx.TouchUIHelper.touchMouseMoveEventName, this.mouseMoveHandler);
1138   Evt.AttachEventToDocument(ASPx.TouchUIHelper.touchMouseUpEventName, this.mouseUpHandler);
1139   this.onMouseDown(e);
1140  }.aspxBind(this);
1141  this.mouseMoveHandler = function(e) {
1142   if(ASPx.TouchUIHelper.isGesture)
1143    return;
1144   var x = Evt.GetEventX(e);
1145   var y = Evt.GetEventY(e);
1146   var xDiff = this.prevX - x;
1147   var yDiff = this.prevY - y;
1148   if(this.vertRecursive) {
1149    var isTopDirection = yDiff < 0;
1150    this.scrollYElement = this.GetElementForVertScrolling(isTopDirection, this.prevIsTopDirection, this.scrollYElement);
1151    this.prevIsTopDirection = isTopDirection;
1152   }
1153   if(this.scrollXElement && xDiff != 0)
1154    this.scrollXElement.scrollLeft += xDiff;
1155   if(this.scrollYElement && yDiff != 0) {
1156    this.scrollYElement.scrollTop += yDiff;
1157    var isOuterScrollableElement = this.scrollableTreeLine[this.scrollableTreeLine.length - 1] == this.scrollYElement;
1158    if(isOuterScrollableElement)
1159     y += yDiff;
1160   }
1161   this.prevX = x;
1162   this.prevY = y;
1163   e.preventDefault();
1164   this.onMouseMove(e);
1165  }.aspxBind(this);
1166  this.mouseUpHandler = function(e) {
1167   this.finishScrolling();
1168   this.onMouseUp(e);
1169  }.aspxBind(this);
1170  this.mouseClickHandler = function(e){
1171   if(this.needPreventScrolling && this.needPreventScrolling(Evt.GetEventSource(e)))
1172    return;
1173   var xDiff = this.firstX - Evt.GetEventX(e);
1174   var yDiff = this.firstY - Evt.GetEventY(e);
1175   if(xDiff > MouseScroller.MinimumOffset || yDiff > MouseScroller.MinimumOffset)
1176    return Evt.PreventEventAndBubble(e);
1177  }.aspxBind(this);
1178  this.finishScrolling = function() {
1179   Evt.DetachEventFromDocument(ASPx.TouchUIHelper.touchMouseMoveEventName, this.mouseMoveHandler);
1180   Evt.DetachEventFromDocument(ASPx.TouchUIHelper.touchMouseUpEventName, this.mouseUpHandler);
1181   this.scrollableTreeLine = [];
1182   this.prevIsTopDirection = null;
1183   mouseDownCounter--;
1184  };
1185 },
1186 GetScrollableElements: function() {
1187  if(!this.vertRecursive) return [ ];
1188  var outerScrollableElementTag = ASPx.Browser.IE ? "HTML" : "BODY";
1189  return ASPx.GetElementTreeLine(this.element, null, function(el) { return el == document; })
1190   .filter(function(el) { return ASPx.IsScrollableElement(el, false, true) || el.tagName == outerScrollableElementTag }.bind(this));
1191 },
1192 GetElementForVertScrolling: function(currentIsTop, prevIsTop, prevElement) {
1193  if(prevElement && currentIsTop === prevIsTop && this.GetVertScrollExcess(prevElement, currentIsTop) > 0)
1194   return prevElement;
1195  for(var i = 0; i < this.scrollableTreeLine.length; i++) {
1196   var element = this.scrollableTreeLine[i];
1197   var excess = this.GetVertScrollExcess(element, currentIsTop);
1198   if(excess > 0)
1199    return element;
1200  }
1201  return null;
1202 },
1203 GetVertScrollExcess: function(element, isTop) {
1204  if(isTop)
1205   return element.scrollTop;
1206  var isBodyElement = element.tagName == "BODY";
1207  var clientHeight = isBodyElement ? ASPx.GetDocumentClientHeight() : element.clientHeight;
1208  return element.scrollHeight - clientHeight - element.scrollTop;
1209 }
1210}
1211ASPx.MouseScroller = MouseScroller;
1212var Evt = { };
1213Evt.GetEvent = function(evt){
1214 return (typeof(event) != "undefined" && event != null && Browser.IE) ? event : evt; 
1215}
1216Evt.IsEventPrevented = function(evt) {
1217 return evt.defaultPrevented || evt.returnValue === false;
1218}
1219Evt.PreventEvent = function(evt){
1220 if(evt.preventDefault)
1221  evt.preventDefault();
1222 else
1223  evt.returnValue = false;
1224 return false;
1225}
1226Evt.PreventEventAndBubble = function(evt){
1227 Evt.PreventEvent(evt);
1228 if(evt.stopPropagation)
1229  evt.stopPropagation();
1230 evt.cancelBubble = true;
1231 return false;
1232}
1233Evt.CancelBubble = function(evt){
1234 evt.cancelBubble = true;
1235 return false;
1236}
1237Evt.PreventImageDragging = function(image) {
1238 if(image) {
1239  if(Browser.NetscapeFamily)
1240   image.onmousedown = function(evt) {
1241    evt.cancelBubble = true;
1242    return false;
1243   };
1244  else
1245   image.ondragstart = function() {
1246    return false;
1247   };
1248 }
1249}
1250Evt.PreventDragStart = function(evt) {
1251 evt = Evt.GetEvent(evt);
1252 var element = Evt.GetEventSource(evt);
1253 if(element.releaseCapture)
1254  element.releaseCapture(); 
1255 return false;
1256}
1257Evt.PreventElementDrag = function(element) {
1258 if(Browser.IE)
1259  Evt.AttachEventToElement(element, "dragstart", Evt.PreventEvent);
1260 else
1261  Evt.AttachEventToElement(element, "mousedown", Evt.PreventEvent);
1262}
1263Evt.PreventElementDragAndSelect = function(element, skipMouseMove, skipIESelect){
1264 if(Browser.WebKitFamily)
1265  Evt.AttachEventToElement(element, "selectstart", Evt.PreventEventAndBubble);
1266 if(Browser.IE){
1267  if(!skipIESelect)
1268   Evt.AttachEventToElement(element, "selectstart", ASPx.FalseFunction);
1269  if(!skipMouseMove)
1270   Evt.AttachEventToElement(element, "mousemove", Selection.ClearOnMouseMove);
1271  Evt.AttachEventToElement(element, "dragstart", Evt.PreventDragStart);
1272 }
1273}
1274Evt.GetEventSource = function(evt){
1275 if(!ASPx.IsExists(evt)) return null; 
1276 return evt.srcElement ? evt.srcElement : evt.target;
1277}
1278Evt.GetKeyCode = function(srcEvt) {
1279 return Browser.NetscapeFamily || Browser.Opera ? srcEvt.which : srcEvt.keyCode;
1280}
1281function clientEventRequiresDocScrollCorrection() {
1282 var isSafariVerLess3 = Browser.Safari && Browser.Version < 3,
1283  isMacOSMobileVerLess51 = Browser.MacOSMobilePlatform && Browser.Version < 5.1;
1284 return Browser.AndroidDefaultBrowser || Browser.AndroidChromeBrowser || !(isSafariVerLess3 || isMacOSMobileVerLess51);
1285}
1286Evt.GetEventX = function(evt){
1287 if(ASPx.TouchUIHelper.isTouchEvent(evt))
1288  return ASPx.TouchUIHelper.getEventX(evt);
1289 return evt.clientX + (clientEventRequiresDocScrollCorrection() ? ASPx.GetDocumentScrollLeft() : 0);
1290}
1291Evt.GetEventY = function(evt){
1292 if(ASPx.TouchUIHelper.isTouchEvent(evt))
1293  return ASPx.TouchUIHelper.getEventY(evt);
1294 return evt.clientY + (clientEventRequiresDocScrollCorrection() ? ASPx.GetDocumentScrollTop() : 0 );
1295}
1296Evt.IsLeftButtonPressed = function(evt) {
1297 if(ASPx.TouchUIHelper.isTouchEvent(evt))
1298  return true;
1299 evt = Evt.GetEvent(evt);
1300 if(!evt) return false;
1301 if(Browser.IE && Browser.Version < 11) {
1302  if(Browser.MSTouchUI)
1303   return true;
1304  return evt.button % 2 == 1; 
1305 } else if(Browser.WebKitFamily) {
1306  if(evt.type === "pointermove")
1307   return evt.buttons === 1;
1308  return evt.which == 1;
1309 } else if(Browser.NetscapeFamily || (Browser.IE && Browser.Version >= 11) || Browser.Edge) {
1310  if(evt.type === ASPx.TouchUIHelper.touchMouseMoveEventName)
1311   return evt.buttons === 1;
1312  return evt.which == 1;
1313 } else if(Browser.Opera)
1314  return evt.button == 0;
1315 return true;
1316}
1317Evt.IsRightButtonPressed = function(evt){
1318 evt = Evt.GetEvent(evt);
1319 if(!ASPx.IsExists(evt)) return false;
1320 if(Browser.IE || Browser.Edge) {
1321  if(evt.type === "pointermove")
1322   return evt.buttons === 2;
1323  return evt.button == 2;
1324 }
1325 else if(Browser.NetscapeFamily || Browser.WebKitFamily)
1326  return evt.which == 3;
1327 else if (Browser.Opera)
1328  return evt.button == 1;
1329 return true;
1330}
1331Evt.GetWheelDelta = function(evt) {
1332 var ret;
1333 if(Browser.NetscapeFamily && Browser.MajorVersion < 17)
1334  ret = -evt.detail;
1335 else if(Browser.Safari)
1336  ret = evt.wheelDelta;
1337 else
1338  ret = -evt.deltaY;
1339 if(Browser.Opera && Browser.Version < 9)
1340  ret = -ret;
1341 return ret;
1342}
1343Evt.IsWheelEventWithDirection = function(evt) {
1344 return ASPx.Data.ArrayContains(["wheel", "mousewheel"], evt.type);
1345}
1346Evt.GetWheelDeltaX = function(evt) {
1347 if(evt.type === "wheel")
1348  return -evt.deltaX;
1349 if(evt.type === "mousewheel")
1350  return evt.wheelDeltaX;
1351}
1352Evt.GetWheelDeltaY = function(evt) {
1353 if(evt.type === "wheel")
1354  return -evt.deltaY;
1355 if(evt.type === "mousewheel")
1356  return evt.wheelDeltaY;
1357}
1358Evt.AttachEventToElement = function(element, eventName, func, onlyBubbling) {
1359 if(element.addEventListener)
1360  element.addEventListener(eventName, func, !onlyBubbling);
1361 else
1362  element.attachEvent("on" + eventName, func);
1363}
1364Evt.DetachEventFromElement = function(element, eventName, func) {
1365 if(element.removeEventListener)
1366  element.removeEventListener(eventName, func, true);
1367 else
1368  element.detachEvent("on" + eventName, func);
1369}
1370Evt.AttachEventToDocument = function(eventName, func) {
1371 var attachingAllowed = ASPx.TouchUIHelper.onEventAttachingToDocument(eventName, func);
1372 if(attachingAllowed)
1373  Evt.AttachEventToDocumentCore(eventName, func);
1374}
1375Evt.AttachEventToDocumentCore = function(eventName, func) {
1376 Evt.AttachEventToElement(document, eventName, func);
1377}
1378Evt.DetachEventFromDocument = function(eventName, func) {
1379 Evt.DetachEventFromDocumentCore(eventName, func);
1380 ASPx.TouchUIHelper.onEventDettachedFromDocument(eventName, func);
1381}
1382Evt.DetachEventFromDocumentCore = function(eventName, func){
1383 Evt.DetachEventFromElement(document, eventName, func);
1384}
1385Evt.GetMouseWheelEventName = function() {
1386 if(Browser.Safari)
1387  return "mousewheel";
1388 if(Browser.NetscapeFamily && Browser.MajorVersion < 17)
1389  return "DOMMouseScroll";
1390 return "wheel";
1391}
1392Evt.AttachMouseEnterToElement = function (element, onMouseOverHandler, onMouseOutHandler) {
1393 Evt.AttachEventToElement(element, ASPx.TouchUIHelper.pointerEnabled ? ASPx.TouchUIHelper.pointerOverEventName : "mouseover", function (evt) { mouseEnterHandler(evt, element, onMouseOverHandler, onMouseOutHandler); });
1394 Evt.AttachEventToElement(element, ASPx.TouchUIHelper.pointerEnabled ? ASPx.TouchUIHelper.pointerOutEventName : "mouseout", function (evt) { mouseEnterHandler(evt, element, onMouseOverHandler, onMouseOutHandler); });
1395}
1396Evt.GetEventRelatedTarget = function(evt, isMouseOverEvent) {
1397 return evt.relatedTarget || (isMouseOverEvent ? evt.srcElement : evt.toElement);
1398}
1399function mouseEnterHandler(evt, element, onMouseOverHandler, onMouseOutHandler) {
1400 var isMouseOverExecuted = !!element.dxMouseOverExecuted;
1401 var isMouseOverEvent = (evt.type == "mouseover" || evt.type == ASPx.TouchUIHelper.pointerOverEventName);
1402 if(isMouseOverEvent && isMouseOverExecuted || !isMouseOverEvent && !isMouseOverExecuted)
1403  return;
1404 var source = Evt.GetEventRelatedTarget(evt, isMouseOverEvent);
1405 if(!ASPx.GetIsParent(element, source)) {
1406  element.dxMouseOverExecuted = isMouseOverEvent;
1407  if(isMouseOverEvent)
1408   onMouseOverHandler(element);
1409  else
1410   onMouseOutHandler(element);
1411 }
1412 else if(isMouseOverEvent && !isMouseOverExecuted) {
1413  element.dxMouseOverExecuted = true;
1414  onMouseOverHandler(element);
1415 }
1416}
1417Evt.DispatchEvent = function(target, eventName, canBubble, cancellable) {
1418 var event;
1419 if(Browser.IE && Browser.Version < 9) {
1420  eventName = "on" + eventName;
1421  if(eventName in target) {
1422   event = document.createEventObject();
1423   target.fireEvent("on" + eventName, event);
1424  }
1425 } else {
1426  event = document.createEvent("Event");
1427  event.initEvent(eventName, canBubble || false, cancellable || false);
1428  target.dispatchEvent(event);
1429 }
1430}
1431Evt.EmulateDocumentOnMouseDown = function(evt) {
1432 Evt.EmulateOnMouseDown(document, evt);
1433}
1434Evt.EmulateOnMouseDown = function(element, evt) {
1435 if(Browser.IE && Browser.Version < 9)
1436  element.fireEvent("onmousedown", evt);
1437 else if(!Browser.WebKitFamily){
1438  var emulatedEvt = document.createEvent("MouseEvents");
1439  emulatedEvt.initMouseEvent("mousedown", true, true, window, 0, evt.screenX, evt.screenY, 
1440   evt.clientX, evt.clientY, evt.ctrlKey, evt.altKey, evt.shiftKey, false, 0, null);
1441  element.dispatchEvent(emulatedEvt);
1442 }
1443}
1444Evt.EmulateOnMouseEvent = function (type, element, evt) {
1445 evt.type = type;
1446 var emulatedEvt = document.createEvent("MouseEvents");
1447 emulatedEvt.initMouseEvent(type, true, true, window, 0, evt.screenX, evt.screenY,
1448  evt.clientX, evt.clientY, evt.ctrlKey, evt.altKey, evt.shiftKey, false, 0, null);
1449 emulatedEvt.target = element;
1450 element.dispatchEvent(emulatedEvt);
1451}
1452Evt.EmulateMouseClick = function (element, evt) {
1453 var x = element.offsetWidth / 2;
1454 var y = element.offsetHeight / 2;
1455 if (!evt)
1456  evt = {
1457   bubbles: true,
1458   cancelable: true,
1459   view: window,
1460   detail: 1,
1461   screenX: 0,
1462   screenY: 0,
1463   clientX: x,
1464   clientY: y,
1465   ctrlKey: false,
1466   altKey: false,
1467   shiftKey: false,
1468   metaKey: false,
1469   button: 0,
1470   relatedTarget: null
1471  };
1472 Evt.EmulateOnMouseEvent("mousedown", element, evt);
1473 Evt.EmulateOnMouseEvent("mouseup", element, evt);
1474 Evt.EmulateOnMouseEvent("click", element, evt);
1475}
1476Evt.DoElementClick = function(element) {
1477 try{
1478  element.click();
1479 }
1480 catch(e){ 
1481 }
1482}
1483Evt.IsActionKeyPressed = function(evt) {
1484 return evt.keyCode === ASPx.Key.Space ||
1485     evt.keyCode === ASPx.Key.Enter ||
1486    (evt.keyCode === ASPx.Key.Down && evt.altKey);
1487}
1488Evt.InvokeMouseClickByKeyDown = function(evt, handler) {
1489 if(Evt.IsActionKeyPressed(evt)) {
1490  ASPx.Evt.PreventEvent(evt); 
1491  if(!handler)
1492   ASPx.Evt.GetEventSource(evt).onclick();
1493  else
1494   handler(evt);
1495 }
1496}
1497ASPx.Evt = Evt;
1498var Attr = { };
1499Attr.GetAttribute = function(obj, attrName){
1500 if(obj.getAttribute)
1501  return obj.getAttribute(attrName);
1502 else if(obj.getPropertyValue)
1503  return obj.getPropertyValue(attrName);
1504 return null;
1505}
1506Attr.SetAttribute = function(obj, attrName, value){
1507 if(obj.setAttribute) {
1508  if(isSourceResetRequired() && attrName.toLowerCase() === "src") 
1509   obj.setAttribute(attrName, "");
1510  obj.setAttribute(attrName, value);
1511 } else if(obj.setProperty)
1512  obj.setProperty(attrName, value, "");
1513}
1514Attr.RemoveAttribute = function(obj, attrName){
1515 if(obj.removeAttribute)
1516  obj.removeAttribute(attrName);
1517 else if(obj.removeProperty)
1518  obj.removeProperty(attrName);
1519}
1520Attr.IsExistsAttribute = function(obj, attrName){
1521 var value = Attr.GetAttribute(obj, attrName);
1522 return (value != null) && (value !== "");
1523}
1524Attr.SetOrRemoveAttribute = function(obj, attrName, value) {
1525 if(!value)
1526  Attr.RemoveAttribute(obj, attrName);
1527 else
1528  Attr.SetAttribute(obj, attrName, value);
1529}
1530Attr.SaveAttribute = function(obj, attrName, savedObj, savedAttrName){
1531 if(!Attr.IsExistsAttribute(savedObj, savedAttrName)){
1532  var oldValue = Attr.IsExistsAttribute(obj, attrName) ? Attr.GetAttribute(obj, attrName) : ASPx.EmptyObject;
1533  Attr.SetAttribute(savedObj, savedAttrName, oldValue);
1534 }
1535}
1536Attr.SaveStyleAttribute = function(obj, attrName){
1537 Attr.SaveAttribute(obj.style, attrName, obj, "saved" + attrName);
1538}
1539Attr.ChangeAttributeExtended = function(obj, attrName, savedObj, savedAttrName, newValue){
1540 Attr.SaveAttribute(obj, attrName, savedObj, savedAttrName);
1541 Attr.SetAttribute(obj, attrName, newValue);
1542}
1543Attr.ChangeAttribute = function(obj, attrName, newValue){
1544 Attr.ChangeAttributeExtended(obj, attrName, obj, "saved" + attrName, newValue);
1545}
1546Attr.ChangeStyleAttribute = function(obj, attrName, newValue){
1547 Attr.ChangeAttributeExtended(obj.style, attrName, obj, "saved" + attrName, newValue);
1548}
1549Attr.ResetAttributeExtended = function(obj, attrName, savedObj, savedAttrName){
1550 Attr.SaveAttribute(obj, attrName, savedObj, savedAttrName);
1551 Attr.SetAttribute(obj, attrName, "");
1552 Attr.RemoveAttribute(obj, attrName);
1553}
1554Attr.ResetAttribute = function(obj, attrName){
1555 Attr.ResetAttributeExtended(obj, attrName, obj, "saved" + attrName);
1556}
1557Attr.ResetStyleAttribute = function(obj, attrName){
1558 Attr.ResetAttributeExtended(obj.style, attrName, obj, "saved" + attrName);
1559}
1560Attr.RestoreAttributeExtended = function(obj, attrName, savedObj, savedAttrName){
1561 if(Attr.IsExistsAttribute(savedObj, savedAttrName)){
1562  var oldValue = Attr.GetAttribute(savedObj, savedAttrName);
1563  if(oldValue != ASPx.EmptyObject)
1564   Attr.SetAttribute(obj, attrName, oldValue);
1565  else
1566   Attr.RemoveAttribute(obj, attrName);
1567  Attr.RemoveAttribute(savedObj, savedAttrName);
1568  return true;
1569 }
1570 return false;
1571}
1572Attr.RestoreAttribute = function(obj, attrName){
1573 return Attr.RestoreAttributeExtended(obj, attrName, obj, "saved" + attrName);
1574}
1575Attr.RestoreStyleAttribute = function(obj, attrName){
1576 return Attr.RestoreAttributeExtended(obj.style, attrName, obj, "saved" + attrName);
1577}
1578Attr.CopyAllAttributes = function(sourceElem, destElement) {
1579 var attrs = sourceElem.attributes;
1580 for(var n = 0; n < attrs.length; n++) {
1581  var attr = attrs[n];
1582  if(attr.specified) {
1583   var attrName = attr.nodeName;
1584   var attrValue = sourceElem.getAttribute(attrName, 2);
1585   if(attrValue == null)
1586    attrValue = attr.nodeValue;
1587   destElement.setAttribute(attrName, attrValue, 0); 
1588  }
1589 }
1590 if(sourceElem.style.cssText !== '')
1591  destElement.style.cssText = sourceElem.style.cssText;
1592}
1593Attr.RemoveAllAttributes = function(element, excludedAttributes) {
1594 var excludedAttributesHashTable = {};
1595 if(excludedAttributes)
1596  excludedAttributesHashTable = Data.CreateHashTableFromArray(excludedAttributes);
1597 if(element.attributes) {
1598  var attrArray = element.attributes;
1599  for(var i = 0; i < attrArray.length; i++) {
1600   var attrName = attrArray[i].name;
1601   if(!ASPx.IsExists(excludedAttributesHashTable[attrName.toLowerCase()])) {
1602    try {
1603     attrArray.removeNamedItem(attrName);
1604    } catch (e) { }
1605   }
1606  }
1607 }
1608}
1609Attr.RemoveStyleAttribute = function(element, attrName) {
1610 if(element.style) {
1611  if(Browser.Firefox && element.style[attrName]) 
1612   element.style[attrName] = "";
1613  if(element.style.removeAttribute && element.style.removeAttribute != "")
1614   element.style.removeAttribute(attrName);
1615  else if(element.style.removeProperty && element.style.removeProperty != "")
1616   element.style.removeProperty(attrName);
1617 }
1618}
1619Attr.RemoveAllStyles = function(element) {
1620 if(element.style) {
1621  for(var key in element.style)
1622   Attr.RemoveStyleAttribute(element, key);
1623    Attr.RemoveAttribute(element, "style");
1624 }
1625}
1626Attr.GetTabIndexAttributeName = function(){
1627 return Browser.IE  ? "tabIndex" : "tabindex";
1628}
1629Attr.ChangeTabIndexAttribute = function(element){
1630 var attribute = Attr.GetTabIndexAttributeName(); 
1631 if(Attr.GetAttribute(element, attribute) != -1)
1632    Attr.ChangeAttribute(element, attribute, -1);
1633}
1634Attr.SaveTabIndexAttributeAndReset = function(element) {
1635 var attribute = Attr.GetTabIndexAttributeName();
1636 Attr.SaveAttribute(element, attribute, element, "saved" + attribute);
1637 Attr.SetAttribute(element, attribute, -1);
1638}
1639Attr.RestoreTabIndexAttribute = function(element){
1640 var attribute = Attr.GetTabIndexAttributeName();
1641 if(Attr.IsExistsAttribute(element, attribute)) {
1642  if(Attr.GetAttribute(element, attribute) == -1) {
1643   if(Attr.IsExistsAttribute(element, "saved" + attribute)){
1644    var oldValue = Attr.GetAttribute(element, "saved" + attribute);
1645    if(oldValue != ASPx.EmptyObject)
1646     Attr.SetAttribute(element, attribute, oldValue);
1647    else {
1648     if(Browser.WebKitFamily) 
1649      Attr.SetAttribute(element, attribute, 0); 
1650     Attr.RemoveAttribute(element, attribute);   
1651    }
1652    Attr.RemoveAttribute(element, "saved" + attribute); 
1653   }
1654  }
1655 }
1656}
1657Attr.ChangeAttributesMethod = function(enabled){
1658 return enabled ? Attr.RestoreAttribute : Attr.ResetAttribute;
1659}
1660Attr.InitiallyChangeAttributesMethod = function(enabled){
1661 return enabled ? Attr.ChangeAttribute : Attr.ResetAttribute;
1662}
1663Attr.ChangeStyleAttributesMethod = function(enabled){
1664 return enabled ? Attr.RestoreStyleAttribute : Attr.ResetStyleAttribute;
1665}
1666Attr.InitiallyChangeStyleAttributesMethod = function(enabled){
1667 return enabled ? Attr.ChangeStyleAttribute : Attr.ResetStyleAttribute;
1668}
1669Attr.ChangeEventsMethod = function(enabled){
1670 return enabled ? Evt.AttachEventToElement : Evt.DetachEventFromElement;
1671}
1672Attr.ChangeDocumentEventsMethod = function(enabled){
1673 return enabled ? Evt.AttachEventToDocument : Evt.DetachEventFromDocument;
1674}
1675Attr.ChangeCellSpanCount = function(cell, value, isColumnSpan) {
1676 if(!cell) return;
1677 var propertyKey = isColumnSpan ? "colSpan" : "rowSpan";
1678 var prevValue = cell[propertyKey];
1679 if(value > 1)
1680  cell[propertyKey] = value;
1681 else if(prevValue !== 1)
1682  Attr.RemoveAttribute(cell, propertyKey);
1683}
1684function isSourceResetRequired() {
1685 return Browser.IE && Browser.MajorVersion >= 11;
1686}
1687ASPx.Attr = Attr;
1688var Aria = {
1689 atomic: "aria-atomic",
1690 checked: "aria-checked",
1691 descendant: "aria-activedescendant",
1692 described: "aria-describedby",
1693 disabled: "aria-disabled",
1694 expanded: "aria-expanded",
1695 haspopup: "aria-haspopup",
1696 invalid: "aria-invalid",
1697 label: "aria-label",
1698 labelled: "aria-labelledby",
1699 level: "aria-level",
1700 owns: "aria-owns",
1701 posinset: "aria-posinset",
1702 role: "role",
1703 selected: "aria-selected",
1704 setsize: "aria-setsize",
1705 valuemax: "aria-valuemax",
1706 valuemin: "aria-valuemin",
1707 valuenow: "aria-valuenow"
1708};
1709Aria.SetOrRemoveDescendant = function(obj, value) {
1710 ASPx.Attr.SetOrRemoveAttribute(obj, Aria.descendant, value);
1711}
1712Aria.SetOrRemoveLabel = function(obj, value) {
1713 ASPx.Attr.SetOrRemoveAttribute(obj, Aria.label, value);
1714};
1715Aria.AppendLabel = function(obj, value, checkExists) {
1716 var currentValue = ASPx.Attr.GetAttribute(obj, Aria.label) || "";
1717 var resultParts = [ ];
1718 if(currentValue)
1719  resultParts.push(currentValue);
1720 var needAppendValue = value && (!checkExists || currentValue.indexOf(value) == -1);
1721 if(needAppendValue)
1722  resultParts.push(value);
1723 ASPx.Attr.SetAttribute(obj, Aria.label, resultParts.join(" "));
1724};
1725Aria.SetOrRemoveLabelled = function(obj, value) {
1726 ASPx.Attr.SetOrRemoveAttribute(obj, Aria.labelled, value);
1727}
1728Aria.SetApplicationRole = function(obj) {
1729  ASPx.Attr.SetAttribute(obj, Aria.role, "application");
1730}
1731Aria.SetSilence = function(obj) {
1732 ASPx.Attr.SetAttribute(obj, Aria.label, ";");
1733}
1734Aria.SetExpanded = function(obj, expanded) {
1735 if(!obj || !ASPx.Attr.GetAttribute(obj, Aria.expanded)) return;
1736 Aria.SetBoolAttribute(obj, Aria.expanded, expanded);
1737}
1738Aria.SetAtomic = function(obj, value) {
1739 Aria.SetBoolAttribute(obj, Aria.atomic, value);
1740}
1741Aria.SetBoolAttribute = function(obj, attribute, value) {
1742 if(value)
1743  ASPx.Attr.SetAttribute(obj, attribute, true);
1744 else 
1745  ASPx.Attr.SetAttribute(obj, attribute, false);
1746}
1747ASPx.Attr.Aria = Aria;
1748var Color = { };
1749function _aspxToHex(d) {
1750 return (d < 16) ? ("0" + d.toString(16)) : d.toString(16);
1751}
1752Color.ColorToHexadecimal = function(colorValue) {
1753 if(typeof(colorValue) == "number") {
1754  var r = colorValue & 0xFF;
1755  var g = (colorValue >> 8) & 0xFF;
1756  var b = (colorValue >> 16) & 0xFF;
1757  return "#" + _aspxToHex(r) + _aspxToHex(g) + _aspxToHex(b);
1758 }
1759 if(colorValue && (colorValue.substr(0, 3).toLowerCase() == "rgb")) {
1760  var re = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/;
1761  var regResult = colorValue.toLowerCase().match(re);
1762  if(regResult) {
1763   var r = parseInt(regResult[1]);
1764   var g = parseInt(regResult[2]);
1765   var b = parseInt(regResult[3]);
1766   return "#" + _aspxToHex(r) + _aspxToHex(g) + _aspxToHex(b);
1767  }
1768  return null;
1769 } 
1770 if(colorValue && (colorValue.charAt(0) == "#"))
1771  return colorValue;
1772 return null;
1773}
1774Color.Names = {
1775 AddColorNames: function(stringResourcesObj) {
1776  if(stringResourcesObj) {
1777   for(var key in stringResourcesObj)
1778    this[key] = stringResourcesObj[key];
1779  }
1780 }
1781}
1782ASPx.Color = Color;
1783var Url = { };
1784Url.Navigate = function(url, target) {
1785 var javascriptPrefix = "javascript:";
1786 if(!url || url === "")
1787  return;
1788 else if(url.indexOf(javascriptPrefix) != -1) 
1789  eval(url.substr(javascriptPrefix.length));
1790 else {
1791  try{
1792   if(target != "")
1793    navigateTo(url, target);
1794   else
1795    location.href = url;
1796  }
1797  catch(e){
1798  }
1799 }
1800}
1801Url.NavigateByLink = function(linkElement) {
1802 Url.Navigate(Attr.GetAttribute(linkElement, "href"), linkElement.target);
1803}
1804Url.GetAbsoluteUrl = function(url) {
1805 if(url)
1806  url = Url.getURLObject(url).href;
1807 return url;
1808}
1809var absolutePathPrefixes = 
1810 [ "about:", "file:///", "ftp://", "gopher://", "http://", "https://", "javascript:", "mailto:", "news:", "res://", "telnet://", "view-source:" ];
1811Url.isAbsoluteUrl = function(url) {
1812 if (url) {
1813  for (var i = 0; i < absolutePathPrefixes.length; i++) {
1814   if(url.indexOf(absolutePathPrefixes[i]) == 0)
1815    return true;
1816  }
1817 }
1818 return false;
1819}
1820Url.getURLObject = function(url) {
1821 var link = document.createElement('A');
1822 link.href = url || "";
1823 return { 
1824  href: link.href,
1825  protocol: link.protocol,
1826  host: link.host,
1827  port: link.port,
1828  pathname: link.pathname,
1829  search: link.search,
1830  hash: link.hash
1831 }; 
1832}
1833Url.getRootRelativeUrl = function(url) {
1834 return getRelativeUrl(url, !Url.isRootRelativeUrl(url), true); 
1835}
1836Url.getPathRelativeUrl = function(url) {
1837 return getRelativeUrl(url, !Url.isPathRelativeUrl(url), false);
1838}
1839function getRelativeUrl(url, isValid, isRootRelative) {
1840 if(url && !(/data:([^;]+\/?[^;]*)(;charset=[^;]*)?(;base64,)/.test(url)) && isValid) {
1841  var urlObject = Url.getURLObject(url);
1842  var baseUrlObject = Url.getURLObject();
1843  if(!Url.isAbsoluteUrl(url) || urlObject.host === baseUrlObject.host && urlObject.protocol === baseUrlObject.protocol) {
1844   url = urlObject.pathname;
1845   if(!isRootRelative)
1846    url = getPathRelativeUrl(baseUrlObject.pathname, url);
1847   url = url + urlObject.search + urlObject.hash;
1848  }
1849 }
1850 return url;   
1851}
1852function getPathRelativeUrl(baseUrl, url) {
1853 var requestSegments = getSegments(baseUrl, false);
1854 var urlSegments = getSegments(url, true);
1855 return buildPathRelativeUrl(requestSegments, urlSegments, 0, 0, "");
1856}
1857function getSegments(url, addTail) {
1858 var segments = [];
1859 var startIndex = 0;
1860 var endIndex = -1;
1861 while ((endIndex = url.indexOf("/", startIndex)) != -1) {
1862  segments.push(url.substring(startIndex, ++endIndex));
1863  startIndex = endIndex;
1864 }
1865 if(addTail && startIndex < url.length)
1866  segments.push(url.substring(startIndex, url.length)); 
1867 return segments;
1868}
1869function buildPathRelativeUrl(requestSegments, urlSegments, reqIndex, urlIndex, buffer) {
1870 if(urlIndex >= urlSegments.length)
1871  return buffer;
1872 if(reqIndex >= requestSegments.length)
1873  return buildPathRelativeUrl(requestSegments, urlSegments, reqIndex, urlIndex + 1, buffer + urlSegments[urlIndex]);
1874 if(requestSegments[reqIndex] === urlSegments[urlIndex] && urlIndex === reqIndex)
1875  return buildPathRelativeUrl(requestSegments, urlSegments, reqIndex + 1, urlIndex + 1, buffer);
1876 return buildPathRelativeUrl(requestSegments, urlSegments, reqIndex + 1, urlIndex, buffer + "../");
1877}
1878Url.isPathRelativeUrl = function(url) {
1879 return !!url && !Url.isAbsoluteUrl(url) && url.indexOf("/") != 0;  
1880}
1881Url.isRootRelativeUrl = function(url) {
1882 return !!url && !Url.isAbsoluteUrl(url) && url.indexOf("/") == 0 && url.indexOf("//") != 0;
1883}
1884function navigateTo(url, target) {
1885 var lowerCaseTarget = target.toLowerCase();
1886 if("_top" == lowerCaseTarget)
1887  top.location.href = url;
1888 else if("_self" == lowerCaseTarget)
1889  location.href = url;
1890 else if("_search" == lowerCaseTarget)
1891  openInNewWindow(url)
1892 else if("_media" == lowerCaseTarget)
1893  openInNewWindow(url)
1894 else if("_parent" == lowerCaseTarget)
1895  window.parent.location.href = url;
1896 else if("_blank" == lowerCaseTarget)
1897  openInNewWindow(url)
1898 else {
1899  var frame = getFrame(top.frames, target);
1900  if(frame != null)
1901   frame.location.href = url;
1902  else
1903   openInNewWindow(url)
1904 }
1905}
1906function openInNewWindow(url) {
1907 if(ASPx.Browser.Safari)
1908  openInNewWindowViaIframe(url);
1909 else {
1910  var newWindow = window.open();
1911  newWindow.opener = null;
1912  newWindow.location = url;
1913 }
1914}
1915function openInNewWindowViaIframe(url) {
1916 var iframe = document.createElement('iframe');
1917 iframe.style.display = 'none';
1918 document.body.appendChild(iframe);
1919 var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
1920 var openArgs = '"' + url + '"';
1921 var script = iframeDoc.createElement('script');
1922 script.type = 'text/javascript';
1923 script.text = 'window.parent = null; ' +
1924  'window.top = null;' +
1925  'window.frameElement = null;' +
1926  'var child = window.open(' + openArgs + ');' +
1927  'child.opener = null';
1928 iframeDoc.body.appendChild(script);
1929 document.body.removeChild(iframe);
1930}
1931ASPx.Url = Url;
1932var Office = {}
1933Office.getHandlerResourceUrl = function(pageUrl) {
1934 var url = pageUrl ? pageUrl : document.URL;
1935 if(url.indexOf("?") != -1)
1936  url = url.substring(0, url.indexOf("?"));
1937 if(url.indexOf("#") != -1) 
1938  url = url.substring(0, url.indexOf("#"));
1939 if(/.*\.aspx$/.test(url))
1940  url = url.substring(0, url.lastIndexOf("/") + 1);
1941 else if(url.lastIndexOf("/") != url.length - 1)
1942  url += "/";
1943 return url;
1944}
1945Office.isBrowserSupportExtendedClientBuffer = function() {
1946 return ASPx.Browser.WebKitFamily || (ASPx.Browser.Firefox && ASPx.Browser.MajorVersion >= 50) || (ASPx.Browser.Edge && ASPx.Browser.MajorVersion >= 14);
1947}
1948ASPx.Office = Office;
1949var Json = { };
1950function isValid(JsonString) {
1951 return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(JsonString.replace(/"(\\.|[^"\\])*"/g, '')))
1952}
1953Json.Eval = function(jsonString, controlName) {
1954 if(isValid(jsonString))
1955  return eval("(" + jsonString + ")");
1956 else
1957  throw new Error(controlName + " received incorrect JSON-data: " + jsonString);
1958}
1959Json.ToJson = function(param){
1960 var paramType = typeof(param);
1961 if((paramType == "undefined") || (param == null))
1962  return null;
1963 if((paramType == "object") && (typeof(param.__toJson) == "function"))
1964  return param.__toJson();
1965 if((paramType == "number") || (paramType == "boolean"))
1966  return param;
1967 if(param.constructor == Date)
1968  return dateToJson(param);
1969 if(paramType == "string") {
1970  var result = param.replace(/\\/g, "\\\\");
1971  result = result.replace(/"/g, "\\\"");
1972  result = result.replace(/\n/g, "\\n");
1973  result = result.replace(/\r/g, "\\r");
1974  result = result.replace(/</g, "\\u003c");
1975  result = result.replace(/>/g, "\\u003e");
1976  return "\"" + result + "\"";
1977 }
1978 if(param.constructor == Array){
1979  var values = [];
1980  for(var i = 0; i < param.length; i++) {
1981   var jsonValue = Json.ToJson(param[i]);
1982   if(jsonValue === null)
1983    jsonValue = "null";
1984   values.push(jsonValue);
1985  }
1986  return "[" + values.join(",") + "]";
1987 }
1988 var exceptKeys = {};
1989 if(ASPx.Ident.IsArray(param.__toJsonExceptKeys))
1990  exceptKeys = Data.CreateHashTableFromArray(param.__toJsonExceptKeys);
1991 exceptKeys["__toJsonExceptKeys"] = 1;
1992 var values = [];
1993 for(var key in param){
1994  if(ASPx.IsFunction(param[key]))
1995   continue;
1996  if(exceptKeys[key] == 1)
1997   continue;
1998  values.push(Json.ToJson(key) + ":" + Json.ToJson(param[key]));
1999 }
2000 return "{" + values.join(",") + "}";
2001}
2002function dateToJson(date) {
2003 var result = [ 
2004  date.getFullYear(),
2005  date.getMonth(),
2006  date.getDate()
2007 ];
2008 var time = {
2009  h: date.getHours(),
2010  m: date.getMinutes(),
2011  s: date.getSeconds(),
2012  ms: date.getMilliseconds()
2013 };
2014 if(time.h || time.m || time.s || time.ms)
2015  result.push(time.h);
2016 if(time.m || time.s || time.ms)
2017  result.push(time.m);
2018 if(time.s || time.ms)
2019  result.push(time.s);
2020 if(time.ms)
2021  result.push(time.ms);
2022 return "new Date(" + result.join() + ")";
2023}
2024ASPx.Json = Json;
2025ASPx.CreateClass = function(parentClass, properties) {
2026 var ret = function() {
2027  if(ret.preparing) 
2028   return delete(ret.preparing);
2029  if(ret.constr) {
2030   this.constructor = ret;
2031   ret.constr.apply(this, arguments);
2032  }
2033 }
2034 ret.prototype = {};
2035 if(parentClass) {
2036  parentClass.preparing = true;
2037  for(var name in parentClass) {
2038   if(parentClass.hasOwnProperty(name) && name != 'constr' && ASPx.IsFunction(parentClass[name]) && !ret[name])
2039    ret[name] = parentClass[name].aspxBind(parentClass);
2040  }
2041  ret.prototype = new parentClass;
2042  ret.prototype.constructor = parentClass;
2043  ret.constr = parentClass;
2044 }
2045 if(properties) {
2046  var constructorName = "constructor";
2047  for(var name in properties){
2048   if(name != constructorName) 
2049    ret.prototype[name] = properties[name];
2050  }
2051  if(properties[constructorName] && properties[constructorName] != Object)
2052   ret.constr = properties[constructorName];
2053 }
2054 return ret;
2055}
2056ASPx.FormatCallbackArg = function(prefix, arg) {
2057 if(prefix == null && arg == null)
2058  return ""; 
2059 if(prefix == null) prefix = "";
2060 if(arg == null) arg = "";
2061 if(arg != null && !ASPx.IsExists(arg.length) && ASPx.IsExists(arg.value))
2062  arg = arg.value;
2063 arg = arg.toString();
2064 return [prefix, '|', arg.length, '|' , arg].join('');
2065}
2066ASPx.FormatCallbackArgs = function(callbackData) {
2067 var sb = [ ];
2068 for(var i = 0; i < callbackData.length; i++)
2069  sb.push(ASPx.FormatCallbackArg(callbackData[i][0], callbackData[i][1]));
2070 return sb.join("");
2071}
2072ASPx.ParseShortcutString = function(shortcutString) {
2073 if(!shortcutString)
2074  return 0;
2075 var isCtrlKey = false;
2076 var isShiftKey = false;
2077 var isAltKey = false;
2078 var isMetaKey = false;
2079 var keyCode = null;
2080 var shcKeys = shortcutString.toString().split("+");
2081 if(shcKeys.length > 0) {
2082  for(var i = 0; i < shcKeys.length; i++) {
2083   var key = Str.Trim(shcKeys[i].toUpperCase());
2084   switch (key) {
2085    case "CTRL":
2086     isCtrlKey = true;
2087     break;
2088    case "SHIFT":
2089     isShiftKey = true;
2090     break;
2091    case "ALT":
2092     isAltKey = true;
2093     break;
2094    case "CMD":
2095     isMetaKey = true;
2096     break;
2097    case "F1": keyCode = ASPx.Key.F1; break;
2098    case "F2": keyCode = ASPx.Key.F2; break;
2099    case "F3": keyCode = ASPx.Key.F3; break;
2100    case "F4": keyCode = ASPx.Key.F4; break;
2101    case "F5": keyCode = ASPx.Key.F5; break;
2102    case "F6": keyCode = ASPx.Key.F6; break;
2103    case "F7": keyCode = ASPx.Key.F7; break;
2104    case "F8": keyCode = ASPx.Key.F8; break;
2105    case "F9": keyCode = ASPx.Key.F9; break;
2106    case "F10":   keyCode = ASPx.Key.F10; break;
2107    case "F11":   keyCode = ASPx.Key.F11; break;
2108    case "F12":   keyCode = ASPx.Key.F12; break;
2109    case "ENTER": keyCode = ASPx.Key.Enter; break;
2110    case "HOME":  keyCode = ASPx.Key.Home; break;
2111    case "END":   keyCode = ASPx.Key.End; break;
2112    case "LEFT":  keyCode = ASPx.Key.Left; break;
2113    case "RIGHT": keyCode = ASPx.Key.Right; break;
2114    case "UP": keyCode = ASPx.Key.Up; break;
2115    case "DOWN":  keyCode = ASPx.Key.Down; break;
2116    case "PAGEUP": keyCode = ASPx.Key.PageUp; break;
2117    case "PAGEDOWN": keyCode = ASPx.Key.PageDown; break;
2118    case "SPACE": keyCode = ASPx.Key.Space; break;
2119    case "TAB":   keyCode = ASPx.Key.Tab; break;
2120    case "BACK":  keyCode = ASPx.Key.Backspace; break;
2121    case "CONTEXT": keyCode = ASPx.Key.ContextMenu; break;
2122    case "ESCAPE":
2123    case "ESC":
2124     keyCode = ASPx.Key.Esc;
2125     break;
2126    case "DELETE":
2127    case "DEL":
2128     keyCode = ASPx.Key.Delete;
2129     break;
2130    case "INSERT":
2131    case "INS":
2132     keyCode = ASPx.Key.Insert;
2133     break;
2134    case "PLUS":
2135     keyCode = "+".charCodeAt(0);
2136     break;
2137    default:
2138     keyCode = key.charCodeAt(0);
2139     break;
2140   }
2141  }
2142 } else
2143  ASPx.ShowErrorAlert("Invalid shortcut");
2144 return ASPx.GetShortcutCode(keyCode, isCtrlKey, isShiftKey, isAltKey, isMetaKey);
2145}
2146ASPx.GetShortcutCode = function(keyCode, isCtrlKey, isShiftKey, isAltKey, isMetaKey) {
2147 var value = keyCode & 0xFFFF;
2148 var flags = 0;
2149 flags |= isCtrlKey ? 1 << 0 : 0;
2150 flags |= isShiftKey ? 1 << 2 : 0;
2151 flags |= isAltKey ? 1 << 4 : 0;
2152 flags |= isMetaKey ? 1 << 8 : 0;
2153 value |= flags << 16;
2154 return value;
2155}
2156ASPx.GetShortcutCodeByEvent = function(evt) {
2157 return ASPx.GetShortcutCode(Evt.GetKeyCode(evt), evt.ctrlKey, evt.shiftKey, evt.altKey, ASPx.Browser.MacOSPlatform ? evt.metaKey : false);
2158}
2159ASPx.IsPasteShortcut = function(evt) {
2160 if(evt.type === "paste")
2161  return true;
2162 var keyCode = Evt.GetKeyCode(evt);
2163 if(Browser.NetscapeFamily && evt.which == 0)  
2164  keyCode = evt.keyCode;
2165 return (evt.ctrlKey && (keyCode == 118  || (keyCode == 86))) ||
2166     (evt.shiftKey && !evt.ctrlKey && !evt.altKey &&
2167     (keyCode == ASPx.Key.Insert)) ;
2168}
2169ASPx.SetFocus = function(element, selectAction) {
2170 function focusCore(element, selectAction){
2171  try {
2172    element.focus();
2173    if(Browser.IE && document.activeElement != element)
2174     element.focus();
2175    if(selectAction) {
2176     var currentSelection = Selection.GetInfo(element);
2177     if(currentSelection.startPos == currentSelection.endPos) {
2178      switch(selectAction) {
2179       case "start":
2180        Selection.SetCaretPosition(element, 0);
2181        break;
2182       case "all":
2183        Selection.Set(element);
2184        break;
2185      }
2186     }
2187    }
2188   } catch (e) {
2189  }
2190 }
2191 if(ASPxClientUtils.iOSPlatform) 
2192  focusCore(element, selectAction);
2193 else {
2194  window.setTimeout(function() { 
2195   focusCore(element, selectAction);
2196  }, 100);
2197 }
2198}
2199ASPx.IsFocusableCore = function(element, skipContainerVisibilityCheck) {
2200 var current = element;
2201 while(current && current.nodeType == 1) {
2202  if(current == element || !skipContainerVisibilityCheck(current)) {
2203   if(current.tagName == "BODY")
2204    return true;
2205   if(current.disabled || !ASPx.GetElementDisplay(current) || !ASPx.GetElementVisibility(current))
2206    return false;
2207  }
2208  current = current.parentNode;
2209 }
2210 return true;
2211}
2212ASPx.IsFocusable = function(element) {
2213 return ASPx.IsFocusableCore(element, ASPx.FalseFunction);
2214}
2215ASPx.IsActionElement = function(element) {
2216 if(!ASPx.IsExistsElement(element))
2217  return false;
2218 var tabIndex = parseInt(ASPx.Attr.GetAttribute(element, ASPx.Attr.GetTabIndexAttributeName()));
2219 var hasTabIndex = !isNaN(tabIndex);
2220 var hasNonNegativeTabIndex = hasTabIndex && tabIndex > -1;
2221 var hasNegativeTabIndex = hasTabIndex && tabIndex < 0;
2222 var tagName = element.tagName;
2223 var focusableElementTags = ["BUTTON", "SELECT", "TEXTAREA", "OPTION", "IFRAME"];
2224 var isFocusableCore = ASPx.IsFocusable(element);
2225 var isFocusableTag = focusableElementTags.indexOf(tagName) !== -1;
2226 var isFocusableLink = tagName === "A" && (!!element.href || hasNonNegativeTabIndex);
2227 var isFocusableInput = tagName === "INPUT" && element.type.toLowerCase() !== "hidden";
2228 var isFocusableByTabIndex = tagName !== "INPUT" && hasNonNegativeTabIndex;
2229 return isFocusableCore && !hasNegativeTabIndex && (isFocusableTag || isFocusableLink || isFocusableInput || isFocusableByTabIndex);
2230};
2231ASPx.GetCanBeActiveElementsInContainer = function(container) {
2232 var canBeActiveTags = ["INPUT", "A", "UL", "BUTTON", "TEXTAREA", "SELECT", "IFRAME"],
2233  canBeActiveElements = [];
2234 Data.ForEach(canBeActiveTags, function(tag) {
2235  var elements = container.getElementsByTagName(tag);
2236  canBeActiveElements = canBeActiveElements.concat([].slice.call(elements));
2237 });
2238 return canBeActiveElements;
2239};
2240function isActionElementAllowedByPredicate(element, predicate) {
2241  var allowedByPredicate = !predicate || predicate(element);
2242  return allowedByPredicate && ASPx.IsActionElement(element);
2243}
2244ASPx.FindChildActionElements = function(container, predicate) {
2245 return ASPx.GetNodes(container, function(el) {
2246  return isActionElementAllowedByPredicate(el, predicate);
2247 });
2248}
2249ASPx.FindAllSortedActionElements = function(container, predicate) {
2250 var result = [ ];
2251 if(!container || !container.getElementsByTagName) return result;
2252 var actionElements = ASPx.FindChildActionElements(container, predicate);
2253 var getTabOrderValue = function(el) {
2254  var tabIndex = parseInt(ASPx.Attr.GetAttribute(el, ASPx.Attr.GetTabIndexAttributeName()));
2255  return isNaN(tabIndex) ? 0 : tabIndex;
2256 }
2257 var positiveTabIndexElements = actionElements.filter(function(x) { return getTabOrderValue(x) > 0; });
2258 var nonPositiveTabIndexElements = actionElements.filter(function(x) { return getTabOrderValue(x) === 0; });
2259 var sortedTabIndexElements = positiveTabIndexElements.sort(function(x, y) { return getTabOrderValue(x) - getTabOrderValue(y); });
2260 result = sortedTabIndexElements.concat(nonPositiveTabIndexElements);
2261 return result;
2262}
2263ASPx.FindFirstChildActionElement = function(container, predicate) {
2264 if(!container || isActionElementAllowedByPredicate(container, predicate))
2265  return !container ? null : container;
2266 var sortedActionElements = ASPx.FindAllSortedActionElements(container, predicate);
2267 return sortedActionElements[0];
2268}
2269ASPx.FindLastChildActionElement = function(container, predicate) {
2270 if(!container)
2271  return null;
2272 var sortedActionElements = ASPx.FindAllSortedActionElements(container, predicate);
2273 var actionElement = sortedActionElements[sortedActionElements.length - 1];
2274 if(!actionElement && isActionElementAllowedByPredicate(container, predicate))
2275  actionElement = container;
2276 return actionElement;
2277}
2278ASPx.GetParentClientControls = function(name) {
2279 nameParts = name.split("_");
2280 var result = [ ];
2281 var controlCollection = ASPx.GetControlCollection();
2282 for(var i = 1; i <= nameParts.length; i++) {
2283  var controlName = nameParts.slice(0, i).join("_");
2284  var control = controlCollection.Get(controlName);
2285  if(control)
2286   result.push(control);
2287 }
2288 return result;
2289}
2290ASPx.GetRootClientControl = function(childControlName) {
2291 var parentControls = ASPx.GetParentClientControls(childControlName);
2292 return parentControls[0];
2293}
2294ASPx.GetClientControlByElementID = function(elementID) {
2295 var parentControls = ASPx.GetParentClientControls(elementID);
2296 return parentControls[parentControls.length - 1];
2297}
2298ASPx.IsExists = function(obj){
2299 return (typeof(obj) != "undefined") && (obj != null);
2300}
2301ASPx.IsFunction = function(obj){
2302 return typeof(obj) == "function";
2303}
2304ASPx.IsNumber = function(str) {
2305 return !isNaN(parseFloat(str)) && isFinite(str);
2306}
2307ASPx.GetDefinedValue = function(value, defaultValue){
2308 return (typeof(value) != "undefined") ? value : defaultValue;
2309}
2310ASPx.CorrectJSFloatNumber = function(number) {
2311 var ret = 21; 
2312 var numString = number.toPrecision(21);
2313 numString = numString.replace("-", ""); 
2314 var integerDigitsCount = numString.indexOf(ASPx.PossibleNumberDecimalSeparators[0]);
2315 if(integerDigitsCount < 0)
2316  integerDigitsCount = numString.indexOf(ASPx.PossibleNumberDecimalSeparators[1]);
2317 var floatDigitsCount = numString.length - integerDigitsCount - 1;
2318 if(floatDigitsCount < 10)
2319  return number;
2320 if(integerDigitsCount > 0) {
2321  ret = integerDigitsCount + 12;
2322 }
2323 var toPrecisionNumber = Math.min(ret, 21);
2324 var newValueString = number.toPrecision(toPrecisionNumber);
2325 return parseFloat(newValueString, 10);
2326}
2327ASPx.CorrectRounding = function(number, step) { 
2328 var regex = /[,|.](.*)/,
2329  isFloatValue = regex.test(number),
2330  isFloatStep = regex.test(step);
2331 if(isFloatValue || isFloatStep) {
2332  var valueAccuracy = (isFloatValue) ? regex.exec(number)[0].length - 1 : 0,
2333   stepAccuracy = (isFloatStep) ? regex.exec(step)[0].length - 1 : 0,
2334   accuracy = Math.max(valueAccuracy, stepAccuracy);
2335  var multiplier = Math.pow(10, accuracy);
2336  number = Math.round((number + step) * multiplier) / multiplier;
2337  return number;
2338 }
2339 return number + step;
2340}
2341ASPx.GetActiveElement = function() {
2342 try{ return document.activeElement; } catch(e) { return null; }
2343}
2344var verticalScrollBarWidth;
2345ASPx.GetVerticalScrollBarWidth = function() {
2346 if(typeof(verticalScrollBarWidth) == "undefined") {
2347  var container = document.createElement("DIV");
2348  container.style.cssText = "position: absolute; top: 0px; left: 0px; visibility: hidden; width: 200px; height: 150px; overflow: hidden; box-sizing: content-box";
2349  document.body.appendChild(container);
2350  var child = document.createElement("P");
2351  container.appendChild(child);
2352  child.style.cssText = "width: 100%; height: 200px;";
2353  var widthWithoutScrollBar = child.offsetWidth;
2354  container.style.overflow = "scroll";
2355  var widthWithScrollBar = child.offsetWidth;
2356  if(widthWithoutScrollBar == widthWithScrollBar)
2357   widthWithScrollBar = container.clientWidth;
2358  verticalScrollBarWidth = widthWithoutScrollBar - widthWithScrollBar;
2359  document.body.removeChild(container);
2360 }
2361 return verticalScrollBarWidth;
2362}
2363function hideScrollBarCore(element, scrollName) {
2364 if(element.tagName == "IFRAME") {
2365  if((element.scrolling == "yes") || (element.scrolling == "auto")) {
2366   Attr.ChangeAttribute(element, "scrolling", "no");
2367   return true;
2368  }
2369 }
2370 else if(element.tagName == "DIV") {
2371  if((element.style[scrollName] == "scroll") || (element.style[scrollName] == "auto")) {
2372   Attr.ChangeStyleAttribute(element, scrollName, "hidden");
2373   return true;
2374  }
2375 }
2376 return false;
2377}
2378function restoreScrollBarCore(element, scrollName) {
2379 if(element.tagName == "IFRAME")
2380  return Attr.RestoreAttribute(element, "scrolling");
2381 else if(element.tagName == "DIV")
2382  return Attr.RestoreStyleAttribute(element, scrollName);
2383 return false;
2384}
2385ASPx.SetScrollBarVisibilityCore = function(element, scrollName, isVisible) {
2386 return isVisible ? restoreScrollBarCore(element, scrollName) : hideScrollBarCore(element, scrollName);
2387}
2388ASPx.SetScrollBarVisibility = function(element, isVisible) {
2389 if(ASPx.SetScrollBarVisibilityCore(element, "overflow", isVisible)) 
2390  return true;
2391 var result = ASPx.SetScrollBarVisibilityCore(element, "overflowX", isVisible)
2392  || ASPx.SetScrollBarVisibilityCore(element, "overflowY", isVisible);
2393 return result;
2394}
2395ASPx.SetInnerHtml = function(element, html) {
2396 if(Browser.IE) {
2397  element.innerHTML = "<em>&nbsp;</em>" + html;
2398  element.removeChild(element.firstChild);
2399 } else
2400  element.innerHTML = html;
2401}
2402ASPx.GetInnerText = function(container) {
2403 if(Browser.Safari && Browser.MajorVersion <= 5) {
2404  var filter = getHtml2PlainTextFilter();
2405  filter.innerHTML = container.innerHTML;
2406  ASPx.SetElementDisplay(filter, true);
2407  var innerText = filter.innerText;
2408  ASPx.SetElementDisplay(filter, false);
2409  return innerText;
2410 } else if(Browser.NetscapeFamily || Browser.WebKitFamily || (Browser.IE && Browser.Version >= 9) || Browser.Edge) {
2411  return container.textContent;
2412 } else
2413  return container.innerText;
2414}
2415var html2PlainTextFilter = null;
2416function getHtml2PlainTextFilter() {
2417 if(html2PlainTextFilter == null) {
2418  html2PlainTextFilter = document.createElement("DIV");
2419  html2PlainTextFilter.style.width = "0";
2420  html2PlainTextFilter.style.height = "0";
2421  html2PlainTextFilter.style.overflow = "visible";
2422  ASPx.SetElementDisplay(html2PlainTextFilter, false);
2423  document.body.appendChild(html2PlainTextFilter);
2424 }
2425 return html2PlainTextFilter;
2426}
2427ASPx.CreateHiddenField = function(name, id) {
2428 var input = document.createElement("INPUT");
2429 input.setAttribute("type", "hidden");
2430 if(name)
2431  input.setAttribute("name", name);
2432 if(id)
2433  input.setAttribute("id", id);
2434 return input;
2435}
2436ASPx.CloneObject = function(srcObject) {
2437  if(typeof(srcObject) != 'object' || srcObject == null)
2438 return srcObject;
2439  var newObject = { };
2440  for(var i in srcObject) 
2441 newObject[i] = srcObject[i];
2442  return newObject;
2443}
2444ASPx.IsPercentageSize = function(size) {
2445 return size && size.indexOf('%') != -1;
2446}
2447ASPx.GetElementById = function(id) {
2448 if(document.getElementById)
2449  return document.getElementById(id);
2450 else
2451  return document.all[id];
2452}
2453ASPx.GetInputElementById = function(id) {
2454 var elem = ASPx.GetElementById(id);
2455 if(!Browser.IE)
2456  return elem;
2457 if(elem) {
2458  if(elem.id == id)
2459   return elem;
2460  else {
2461   for(var i = 1; i < document.all[id].length; i++) {
2462    if(document.all[id][i].id == id)
2463     return document.all[id][i];
2464   }
2465  }
2466 }
2467 return null;
2468}
2469ASPx.GetElementByIdInDocument = function(documentObj, id) {
2470 if(documentObj.getElementById)
2471  return documentObj.getElementById(id);
2472 else
2473  return documentObj.all[id];
2474}
2475ASPx.GetIsParent = function(parentElement, element) {
2476 if(!parentElement || !element)
2477  return false;
2478 while(element){
2479  if(element === parentElement)
2480   return true;
2481  if(element.tagName === "BODY")
2482   return false;
2483  element = element.parentNode;
2484 }
2485 return false;
2486}
2487ASPx.GetParentById = function(element, id) {
2488 element = element.parentNode;
2489 while(element){
2490  if(element.id === id)
2491   return element;
2492  element = element.parentNode;
2493 }
2494 return null;
2495}
2496ASPx.GetParentByPartialId = function(element, idPart){
2497 while(element && element.tagName != "BODY") {
2498  if(element.id && element.id.match(idPart)) 
2499   return element;
2500  element = element.parentNode;
2501 }
2502 return null;
2503}
2504ASPx.GetParentByTagName = function(element, tagName) {
2505 tagName = tagName.toUpperCase();
2506 while(element) {
2507  if(element.tagName === "BODY")
2508   return null;
2509  if(element.tagName === tagName)
2510   return element;
2511  element = element.parentNode;
2512 }
2513 return null;
2514}
2515function getParentByClassNameInternal(element, className, selector) {
2516 while(element != null) {
2517  if(element.tagName == "BODY" || element.nodeName == "#document")
2518   return null;
2519  if(selector(element, className))
2520   return element;
2521  element = element.parentNode;
2522 }
2523 return null;
2524}
2525ASPx.GetParentByPartialClassName = function(element, className) {
2526 return getParentByClassNameInternal(element, className, ASPx.ElementContainsCssClass);
2527}
2528ASPx.GetParentByClassName = function(element, className) {
2529 return getParentByClassNameInternal(element, className, ASPx.ElementHasCssClass);
2530}
2531ASPx.GetParentByTagNameAndAttributeValue = function(element, tagName, attrName, attrValue) {
2532 tagName = tagName.toUpperCase();
2533 while(element != null) {
2534  if(element.tagName == "BODY")
2535   return null;
2536  if(element.tagName == tagName && element[attrName] == attrValue)
2537   return element;
2538  element = element.parentNode;
2539 }
2540 return null;
2541}
2542ASPx.GetParent = function(element, testFunc){
2543 if (!ASPx.IsExists(testFunc)) return null;
2544 while(element != null && element.tagName != "BODY"){
2545  if(testFunc(element))
2546   return element;
2547  element = element.parentNode;
2548 }
2549 return null;
2550}
2551ASPx.GetElementTreeLine = function(element, stopTagName, stopFunc) {
2552 var result = [];
2553 stopTagName = stopTagName || "BODY";
2554 while(element != null) {
2555  if(!stopFunc && element.tagName == stopTagName)
2556   break;
2557  if(stopFunc && stopFunc(element))
2558   break;
2559  result.push(element);
2560  element = element.parentNode;
2561 }
2562 return result;
2563},
2564ASPx.IsScrollableElement = function(element, isHorzScrollable, isVertScrollable) {
2565 isHorzScrollable = ASPx.IsExists(isHorzScrollable) ? isHorzScrollable : true;
2566 isVertScrollable = ASPx.IsExists(isVertScrollable) ? isVertScrollable : true;
2567 var style = ASPx.GetCurrentStyle(element);
2568 var overflowStyleNames = [ "overflow" ];
2569 if(isHorzScrollable) 
2570  overflowStyleNames.push("overflowX");
2571 if(isVertScrollable)
2572  overflowStyleNames.push("overflowY");
2573 for(var i = 0; i < overflowStyleNames.length; i++)
2574  if(style[overflowStyleNames[i]] == "scroll" || style[overflowStyleNames[i]] == "auto")
2575   return true;
2576 return false;
2577},
2578ASPx.GetPreviousSibling = function(el) {
2579 if(el.previousElementSibling) {
2580  return el.previousElementSibling;
2581 } else {
2582  while(el = el.previousSibling) {
2583   if(el.nodeType === 1)
2584    return el;
2585  }
2586 }
2587}
2588ASPx.ElementHasCssClass = function(element, className) {
2589 try {
2590  var classList = element.classList;
2591  if(!classList) {
2592   if(!element.className)
2593    return false;
2594   var elementClasses = element.className.split(" ");
2595  }
2596  var classNames = className.split(" ");
2597  for(var i = classNames.length - 1; i >= 0; i--) {
2598   if(classList) {
2599    if(!classList.contains(classNames[i]))
2600     return false;
2601    continue;
2602   }
2603   if(Data.ArrayIndexOf(elementClasses, classNames[i]) < 0)
2604    return false;
2605  }
2606  return true;
2607 } catch(e) {
2608  return false;
2609 }
2610}
2611ASPx.ElementContainsCssClass = function(element, className) {
2612 try {
2613  if(!element.className)
2614   return false;
2615  return element.className.indexOf(className) != -1;
2616 } catch(e) {
2617  return false;
2618 }
2619}
2620ASPx.AddClassNameToElement = function (element, className) {
2621 if(!element || typeof(className) !== "string" ) return;
2622 className = className.trim();
2623 if(!ASPx.ElementHasCssClass(element, className) && className !== "")
2624  element.className = (element.className === "") ? className : element.className + " " + className;
2625}
2626ASPx.RemoveClassNameFromElement = function(element, className) {
2627 if(!element) return;
2628 var updClassName = " " + element.className + " ";
2629 var newClassName = updClassName.replace(" " + className + " ", " ");
2630 if(updClassName.length != newClassName.length)
2631  element.className = Str.Trim(newClassName);
2632}
2633ASPx.GetClassNameList = function(element) {
2634 if(element.classList)
2635  return [ ].slice.call(element.classList);
2636 return element.className.replace(/^\s+|\s+$/g, '').split(/\s+/);
2637}
2638function nodeListToArray(nodeList, filter) {
2639 var result = [];
2640 for(var i = 0, element; element = nodeList[i]; i++) {
2641  if(filter && !filter(element))
2642   continue;
2643  result.push(element);
2644 }
2645 return result;
2646}
2647function getItemByIndex(collection, index) {
2648 if(!index) index = 0;
2649 if(collection != null && collection.length > index)
2650  return collection[index];
2651 return null;
2652}
2653ASPx.GetChildNodesByClassName = function(parent, className) {
2654 if(parent.querySelectorAll) {
2655  var children = parent.querySelectorAll('.' + className);
2656  return nodeListToArray(children, function(element) { 
2657   return element.parentNode === parent;
2658  });
2659 }
2660 return ASPx.GetChildNodes(parent, function(elem) { return elem.className && ASPx.ElementHasCssClass(elem, className); });
2661}
2662ASPx.GetChildNodesByPartialClassName = function(element, className) {
2663 return ASPx.GetChildElementNodesByPredicate(element,
2664  function(child) {
2665   return ASPx.ElementContainsCssClass(child, className);
2666  });
2667}
2668ASPx.GetChildByPartialClassName = function(element, className, index) {
2669 if(element != null){    
2670  var collection = ASPx.GetChildNodesByPartialClassName(element, className);
2671  return getItemByIndex(collection, index);
2672 }
2673 return null;
2674}
2675ASPx.GetChildByClassName = function(element, className, index) {
2676 if(element != null){    
2677  var collection = ASPx.GetChildNodesByClassName(element, className);
2678  return getItemByIndex(collection, index);
2679 }
2680 return null;
2681}
2682ASPx.GetNodesByPartialClassName = function(element, className) {
2683 if(element.querySelectorAll) {
2684  var list = element.querySelectorAll('*[class*=' + className + ']');
2685  return nodeListToArray(list);
2686 }
2687 var collection = element.all || element.getElementsByTagName('*');
2688 var ret = [ ];
2689 if(collection != null) {
2690  for(var i = 0; i < collection.length; i ++) {
2691   if(ASPx.ElementContainsCssClass(collection[i], className))
2692    ret.push(collection[i]);
2693  }
2694 }
2695 return ret;
2696}
2697ASPx.GetNodesByClassName = function(parent, className) {
2698 if(parent.querySelectorAll) {
2699  var children = parent.querySelectorAll('.' + className);
2700  return nodeListToArray(children);
2701 }
2702 return ASPx.GetNodes(parent, function(elem) { return elem.className && ASPx.ElementHasCssClass(elem, className); });
2703}
2704ASPx.GetNodeByClassName = function(element, className, index) {
2705 if(element != null){    
2706  var collection = ASPx.GetNodesByClassName(element, className);
2707  return getItemByIndex(collection, index);
2708 }
2709 return null;
2710}
2711ASPx.GetChildById = function(element, id) {
2712 if(element.all) {
2713  var child = element.all[id];
2714  if(!child) {
2715   child = element.all(id); 
2716   if(!child)
2717    return Browser.IE ? document.getElementById(id) : null; 
2718  } 
2719  if(!ASPx.IsExists(child.length)) 
2720   return child;
2721  else
2722   return ASPx.GetElementById(id);
2723 }
2724 else
2725  return ASPx.GetElementById(id);
2726}
2727ASPx.GetNodesByPartialId = function(element, partialName, list) {
2728 if(element.id && element.id.indexOf(partialName) > -1) 
2729  list.push(element);
2730 if(element.childNodes) {
2731  for(var i = 0; i < element.childNodes.length; i ++) 
2732   ASPx.GetNodesByPartialId(element.childNodes[i], partialName, list);
2733 }
2734}
2735ASPx.GetNodesByTagName = function(element, tagName) {
2736 tagName = tagName.toUpperCase();
2737 if(element) {
2738  if(element.getElementsByTagName) 
2739   return element.getElementsByTagName(tagName);
2740  else if(element.all && element.all.tags !== undefined)
2741   return Browser.Netscape ? element.all.tags[tagName] : element.all.tags(tagName);
2742 }
2743 return null;
2744}
2745ASPx.GetNodeByTagName = function(element, tagName, index) {
2746 if(element != null){    
2747  var collection = ASPx.GetNodesByTagName(element, tagName);
2748  return getItemByIndex(collection, index);
2749 }
2750 return null;
2751}
2752ASPx.GetChildNodesByTagName = function(parent, tagName) {
2753 return ASPx.GetChildNodes(parent, function (child) { return child.tagName === tagName; });
2754}
2755ASPx.GetChildByTagName = function(element, tagName, index) {
2756 if(element != null){    
2757  var collection = ASPx.GetChildNodesByTagName(element, tagName);
2758  return getItemByIndex(collection, index);
2759 }
2760 return null;
2761}
2762ASPx.RetrieveByPredicate = function(scourceCollection, predicate) {
2763 var result = [];
2764 for(var i = 0; i < scourceCollection.length; i++) {
2765  var element = scourceCollection[i];
2766  if(!predicate || predicate(element)) 
2767   result.push(element);
2768 }
2769 return result;
2770}
2771ASPx.GetChildNodes = function(parent, predicate) {
2772 return ASPx.RetrieveByPredicate(parent.childNodes, predicate);
2773}
2774ASPx.GetNodes = function(parent, predicate) {
2775 var c = parent.all || parent.getElementsByTagName('*');
2776 return ASPx.RetrieveByPredicate(c, predicate);
2777}
2778ASPx.GetChildElementNodes = function(parent) {
2779 if(!parent) return null;
2780 return ASPx.GetChildNodes(parent, function(e) { return e.nodeType == 1 })
2781}
2782ASPx.GetChildElementNodesByPredicate = function(parent, predicate) {
2783 if(!parent) return null;
2784 if(!predicate) return ASPx.GetChildElementNodes(parent);
2785 return ASPx.GetChildNodes(parent, function(e) { return e.nodeType == 1 && predicate(e); })
2786}
2787ASPx.GetTextNode = function(element, index) {
2788 if(element != null){
2789  var collection = [ ];
2790  ASPx.GetTextNodes(element, collection);
2791  return getItemByIndex(collection, index);
2792 }
2793 return null;
2794}
2795ASPx.GetTextNodes = function(element, collection) {
2796 for(var i = 0; i < element.childNodes.length; i ++){
2797  var childNode = element.childNodes[i];
2798  if(ASPx.IsExists(childNode.nodeValue))
2799   collection.push(childNode);
2800  ASPx.GetTextNodes(childNode, collection);
2801 }
2802}
2803ASPx.GetNormalizedTextNode = function(element, index) {
2804 var textNode = ASPx.GetTextNode(element, index);
2805 if(textNode != null)
2806  ASPx.MergeAdjacentTextNodes(textNode);
2807 return textNode;
2808}
2809ASPx.MergeAdjacentTextNodes = function(firstTextNode) {
2810 if(!ASPx.IsExists(firstTextNode.nodeValue))
2811  return;
2812 var textNode = firstTextNode;
2813 while(textNode.nextSibling && ASPx.IsExists(textNode.nextSibling.nodeValue)) {
2814  textNode.nodeValue += textNode.nextSibling.nodeValue;
2815  textNode.parentNode.removeChild(textNode.nextSibling);
2816 }
2817}
2818ASPx.GetElementDocument = function(element) {
2819 return element.document || element.ownerDocument;
2820}
2821ASPx.RemoveElement = function(element) {
2822 if(element && element.parentNode)
2823  element.parentNode.removeChild(element);
2824}
2825ASPx.ReplaceTagName = function(element, newTagName, cloneChilds) {
2826 if(element.nodeType != 1)
2827  return null;
2828 if(element.nodeName == newTagName)
2829  return element;
2830 cloneChilds = cloneChilds !== undefined ? cloneChilds : true;
2831 var doc = element.ownerDocument;
2832 var newElem = doc.createElement(newTagName);
2833 Attr.CopyAllAttributes(element, newElem);
2834 if(cloneChilds) {
2835  for(var i = 0; i < element.childNodes.length; i++)
2836   newElem.appendChild(element.childNodes[i].cloneNode(true));
2837 }
2838 else {
2839  for(var child; child = element.firstChild; )
2840   newElem.appendChild(child);
2841 }
2842 element.parentNode.replaceChild(newElem, element);
2843 return newElem;
2844}
2845ASPx.RemoveOuterTags = function(element) {
2846 if(ASPx.Browser.IE) {
2847  element.insertAdjacentHTML( 'beforeBegin', element.innerHTML ) ;
2848  ASPx.RemoveElement(element);
2849 } else {
2850  var docFragment = element.ownerDocument.createDocumentFragment();
2851  for(var i = 0; i < element.childNodes.length; i++)
2852   docFragment.appendChild(element.childNodes[i].cloneNode(true));
2853  element.parentNode.replaceChild(docFragment, element);
2854 }
2855}
2856ASPx.WrapElementInNewElement = function(element, newElementTagName) { 
2857 var wrapElement = null;
2858 if(Browser.IE) {
2859  var wrapElement = element.ownerDocument.createElement(newElementTagName);
2860  wrapElement.appendChild(element.cloneNode(true));
2861  element.parentNode.insertBefore(wrapElement, element);
2862  element.parentNode.removeChild(element);
2863 } else {
2864  var docFragment = element.ownerDocument.createDocumentFragment();
2865  wrapElement = element.ownerDocument.createElement(newElementTagName);
2866  docFragment.appendChild(wrapElement);
2867  wrapElement.appendChild(element.cloneNode(true));
2868  element.parentNode.replaceChild(docFragment, element);
2869 }
2870 return wrapElement;
2871}
2872ASPx.InsertElementAfter = function(newElement, targetElement) {
2873 var parentElem = targetElement.parentNode;
2874 if(parentElem.childNodes[parentElem.childNodes.length - 1] == targetElement)
2875  parentElem.appendChild(newElement);
2876 else
2877  parentElem.insertBefore(newElement, targetElement.nextSibling);
2878}
2879ASPx.SetElementOpacity = function(element, value) {
2880  var useOpacityStyle = !Browser.IE || Browser.Version > 8;
2881  if(useOpacityStyle){
2882   element.style.opacity = value;
2883  } else {
2884   if(typeof(element.filters) === "object" && element.filters["DXImageTransform.Microsoft.Alpha"])
2885    element.filters.item("DXImageTransform.Microsoft.Alpha").Opacity = value*100;
2886   else
2887   element.style.filter = "alpha(opacity=" + (value * 100) + ")";
2888  }
2889}
2890ASPx.GetElementOpacity = function(element) {
2891 var useOpacityStyle = !Browser.IE || Browser.Version > 8;
2892 if(useOpacityStyle)
2893  return parseFloat(ASPx.GetCurrentStyle(element).opacity);
2894 else {
2895  if(typeof(element.filters) === "object" && element.filters["DXImageTransform.Microsoft.Alpha"]){
2896   return element.filters.item("DXImageTransform.Microsoft.Alpha").Opacity / 100;
2897  } else {
2898   var alphaValue = ASPx.GetCurrentStyle(element).filter;
2899   var value = alphaValue.replace("alpha(opacity=", "");
2900   value = value.replace(")", "");
2901   return parseInt(value) / 100;
2902  }
2903  return 100;
2904 }
2905}
2906ASPx.GetElementDisplay = function(element, isCurrentStyle) {
2907 if (isCurrentStyle)
2908  return ASPx.GetCurrentStyle(element).display != "none";
2909 return element.style.display != "none";
2910}
2911ASPx.SetElementDisplay = function(element, value, checkCurrentStyle, makeInline) {
2912 if(!element) return;
2913 if(typeof(value) === "string")
2914  element.style.display = value;
2915 else if(!value)
2916  element.style.display = "none";
2917 else {
2918  element.style.display = "";
2919  if(checkCurrentStyle && ASPx.GetCurrentStyle(element).display === "none"){
2920   var displayAddon = makeInline ? "inline-" : "";
2921   switch(element.tagName){
2922    case "TABLE": {
2923     element.style.display = displayAddon + "table";
2924     break;
2925    }
2926    default: {
2927     element.style.display = displayAddon + "block";
2928     break;
2929    }
2930   }
2931  }
2932 }
2933}
2934ASPx.GetElementVisibility = function(element, isCurrentStyle) {
2935 if(isCurrentStyle)
2936  return ASPx.GetCurrentStyle(element).visibility != "hidden";
2937 return element.style.visibility != "hidden";
2938}
2939ASPx.SetElementVisibility = function(element, value) {
2940 if(!element) return;
2941 if(typeof(value) === "string")
2942  element.style.visibility = value;
2943 else
2944  element.style.visibility = value ? "visible" : "hidden";
2945}
2946ASPx.IsElementVisible = function(element, isCurrentStyle) {
2947 while(element && element.tagName != "BODY") {
2948  if(!ASPx.GetElementDisplay(element, isCurrentStyle) || (!ASPx.GetElementVisibility(element, isCurrentStyle) && !Attr.IsExistsAttribute(element, "errorFrame")))
2949     return false;
2950  element = element.parentNode;
2951 }
2952 return true;
2953}
2954ASPx.IsElementDisplayed = function(element) {
2955 while(element && element.tagName != "BODY") {
2956  if(!ASPx.GetElementDisplay(element))
2957     return false;
2958  element = element.parentNode;
2959 }
2960 return true;
2961}
2962ASPx.AddStyleSheetLinkToDocument = function(doc, linkUrl) {
2963 var newLink = createStyleLink(doc, linkUrl);
2964 var head = ASPx.GetHeadElementOrCreateIfNotExist(doc);
2965 head.appendChild(newLink);
2966}
2967ASPx.GetHeadElementOrCreateIfNotExist = function(doc) {
2968 var elements = ASPx.GetNodesByTagName(doc, "head");
2969 var head = null;
2970 if(elements.length == 0) {
2971  head = doc.createElement("head");
2972  head.visibility = "hidden";
2973  doc.insertBefore(head, doc.body);
2974 } else
2975  head = elements[0];
2976 return head;
2977}
2978function createStyleLink(doc, url) {
2979 var newLink = doc.createElement("link");
2980 Attr.SetAttribute(newLink, "href", url);
2981 Attr.SetAttribute(newLink, "type", "text/css");
2982 Attr.SetAttribute(newLink, "rel", "stylesheet");
2983 return newLink;
2984}
2985ASPx.GetCurrentStyle = function(element) {
2986 if(element.currentStyle)
2987  return element.currentStyle;
2988 else if(document.defaultView && document.defaultView.getComputedStyle) { 
2989  var result = document.defaultView.getComputedStyle(element, null);
2990  if(!result && Browser.Firefox && window.frameElement) {
2991   var changes = [];
2992   var curElement = window.frameElement;
2993   while(!(result = document.defaultView.getComputedStyle(element, null))) {
2994    changes.push([curElement, curElement.style.display]);
2995    ASPx.SetStylesCore(curElement, "display", "block", true);
2996    curElement = curElement.tagName == "BODY" ? curElement.ownerDocument.defaultView.frameElement : curElement.parentNode;
2997   }
2998   result = ASPx.CloneObject(result);
2999   for(var ch, i = 0; ch = changes[i]; i++)
3000    ASPx.SetStylesCore(ch[0], "display", ch[1]);
3001   var reflow = document.body.offsetWidth; 
3002  }
3003  return result;
3004 }
3005 return window.getComputedStyle(element, null);
3006}
3007ASPx.CreateStyleSheetInDocument = function(doc) {
3008 if(doc.createStyleSheet) {
3009  try {
3010   return doc.createStyleSheet();
3011  }
3012  catch(e) {
3013   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.";
3014   throw new Error(message);
3015  }
3016 }
3017 else {
3018  var styleSheet = doc.createElement("STYLE");
3019  ASPx.GetNodeByTagName(doc, "HEAD", 0).appendChild(styleSheet);
3020  return styleSheet.sheet;
3021 }
3022}
3023ASPx.currentStyleSheet = null;
3024ASPx.GetCurrentStyleSheet = function() {
3025 if(!ASPx.currentStyleSheet)
3026  ASPx.currentStyleSheet = ASPx.CreateStyleSheetInDocument(document);
3027 return ASPx.currentStyleSheet;
3028}
3029function getStyleSheetRules(styleSheet){
3030 try {
3031  return Browser.IE && Browser.Version == 8 ? styleSheet.rules : styleSheet.cssRules;
3032 }
3033 catch(e) {
3034  return null;
3035 }
3036}
3037ASPx.cachedCssRules = { };
3038ASPx.GetStyleSheetRules = function (className, stylesStorageDocument) {
3039 if(ASPx.cachedCssRules[className]) {
3040  if(ASPx.cachedCssRules[className] != ASPx.EmptyObject)
3041   return ASPx.cachedCssRules[className];
3042  return null;
3043 }
3044 var result = iterateStyleSheetRules(stylesStorageDocument, function(rule) {
3045  if(rule.selectorText == "." + className){
3046   ASPx.cachedCssRules[className] = rule;
3047   return rule;
3048  }
3049 });
3050 if(ASPx.IsExists(result))
3051  return result;
3052 ASPx.cachedCssRules[className] = ASPx.EmptyObject;
3053 return null;
3054}
3055function iterateStyleSheetRules(stylesStorageDocument, callback) {
3056 var doc = stylesStorageDocument || document;
3057 for(var i = 0; i < doc.styleSheets.length; i ++){
3058  var styleSheet = doc.styleSheets[i];
3059  var rules = getStyleSheetRules(styleSheet);
3060  if(rules != null){
3061   for(var j = 0; j < rules.length; j ++) {
3062    var result = callback(rules[j]);
3063    if(result !== undefined)
3064     return result;
3065   }
3066  }
3067 }
3068};
3069ASPx.ClearCachedCssRules = function(){
3070 ASPx.cachedCssRules = { };
3071}
3072var styleCount = 0;
3073var styleNameCache = { };
3074ASPx.CreateImportantStyleRule = function(styleSheet, cssText, postfix, prefix) {
3075 styleSheet = styleSheet || ASPx.GetCurrentStyleSheet();
3076 var cacheKey = (postfix ? postfix + "||" : "") + cssText + (prefix ? "||" + prefix : "");
3077 if(styleNameCache[cacheKey])
3078  return styleNameCache[cacheKey];
3079 prefix = prefix ? prefix + " " : "";
3080 var className = "dxh" + styleCount + (postfix ? postfix : "");
3081 ASPx.AddStyleSheetRule(styleSheet, prefix + "." + className, ASPx.CreateImportantCssText(cssText));
3082 styleCount++;
3083 styleNameCache[cacheKey] = className;
3084 return className; 
3085}
3086ASPx.CreateImportantCssText = function(cssText) {
3087 var newText = "";
3088 var attributes = cssText.split(";");
3089 for(var i = 0; i < attributes.length; i++){
3090  if(attributes[i] != "")
3091   newText += attributes[i] + " !important;";
3092 }
3093 return newText;
3094}
3095ASPx.AddStyleSheetRule = function(styleSheet, selector, cssText){
3096 if(!cssText) return;
3097 if(Browser.IE)
3098  styleSheet.addRule(selector, cssText);
3099 else
3100  styleSheet.insertRule(selector + " { " + cssText + " }", styleSheet.cssRules.length);
3101}
3102ASPx.GetPointerCursor = function() {
3103 return "pointer";
3104}
3105ASPx.SetPointerCursor = function(element) {
3106 if(element.style.cursor == "")
3107  element.style.cursor = ASPx.GetPointerCursor();
3108}
3109ASPx.SetElementFloat = function(element, value) {
3110 if(ASPx.IsExists(element.style.cssFloat))
3111  element.style.cssFloat = value;
3112 else if(ASPx.IsExists(element.style.styleFloat))
3113  element.style.styleFloat = value;
3114 else
3115  Attr.SetAttribute(element.style, "float", value);
3116}
3117ASPx.GetElementFloat = function(element) {
3118 var currentStyle = ASPx.GetCurrentStyle(element);
3119 if(ASPx.IsExists(currentStyle.cssFloat))
3120  return currentStyle.cssFloat;
3121 if(ASPx.IsExists(currentStyle.styleFloat))
3122  return currentStyle.styleFloat;
3123 return Attr.GetAttribute(currentStyle, "float");
3124}
3125function getElementDirection(element) {
3126 return ASPx.GetCurrentStyle(element).direction;
3127}
3128ASPx.IsElementRightToLeft = function(element) {
3129 return getElementDirection(element) == "rtl";
3130}
3131ASPx.AdjustVerticalMarginsInContainer = function(container) {
3132 var containerBorderAndPaddings = ASPx.GetTopBottomBordersAndPaddingsSummaryValue(container);
3133 var flowElements = [], floatElements = [], floatTextElements = [];
3134 var maxHeight = 0, maxFlowHeight = 0;
3135 for(var i = 0; i < container.childNodes.length; i++) {
3136  var element = container.childNodes[i];
3137  if(!element.offsetHeight) continue;
3138  ASPx.ClearVerticalMargins(element);
3139 }
3140 for(var i = 0; i < container.childNodes.length; i++) {
3141  var element = container.childNodes[i];
3142  if(!element.offsetHeight) continue;
3143  var float = ASPx.GetElementFloat(element);
3144  var isFloat = (float === "left" || float === "right");
3145  if(isFloat)
3146   floatElements.push(element)
3147  else {
3148   flowElements.push(element);
3149   if(element.tagName !== "IMG"){
3150    if(!ASPx.IsTextWrapped(element))
3151     element.style.verticalAlign = 'baseline'; 
3152    floatTextElements.push(element);
3153   }
3154   if(element.tagName === "DIV")
3155    Attr.ChangeStyleAttribute(element, "float", "left"); 
3156  }
3157  if(element.offsetHeight > maxHeight) 
3158   maxHeight = element.offsetHeight;
3159  if(!isFloat && element.offsetHeight > maxFlowHeight) 
3160   maxFlowHeight = element.offsetHeight;
3161 }
3162 for(var i = 0; i < flowElements.length; i++) 
3163  Attr.RestoreStyleAttribute(flowElements[i], "float");
3164 var containerBorderAndPaddings = ASPx.GetTopBottomBordersAndPaddingsSummaryValue(container);
3165 var containerHeight = container.offsetHeight - containerBorderAndPaddings;
3166 if(maxHeight == containerHeight) {
3167  var verticalAlign = ASPx.GetCurrentStyle(container).verticalAlign;
3168  for(var i = 0; i < floatTextElements.length; i++)
3169   floatTextElements[i].style.verticalAlign = '';
3170  containerHeight = container.offsetHeight - containerBorderAndPaddings;
3171  for(var i = 0; i < floatElements.length; i++)
3172   adjustVerticalMarginsCore(floatElements[i], containerHeight, verticalAlign, true);
3173  for(var i = 0; i < flowElements.length; i++) {
3174   if(maxFlowHeight != maxHeight)
3175    adjustVerticalMarginsCore(flowElements[i], containerHeight, verticalAlign);
3176  }
3177 }
3178}
3179ASPx.AdjustVerticalMargins = function(element) {
3180 ASPx.ClearVerticalMargins(element);
3181 var parentElement = element.parentNode;
3182 var parentHeight = parentElement.offsetHeight - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(parentElement);
3183 adjustVerticalMarginsCore(element, parentHeight, ASPx.GetCurrentStyle(parentElement).verticalAlign);
3184}
3185function adjustVerticalMarginsCore(element, parentHeight, verticalAlign, toBottom) {
3186 var marginTop;
3187 if(verticalAlign == "top")
3188  marginTop = 0;
3189 else if(verticalAlign == "bottom")
3190  marginTop = parentHeight - element.offsetHeight;
3191 else
3192  marginTop = (parentHeight - element.offsetHeight) / 2;
3193 if(marginTop !== 0){
3194  var marginAttr = (toBottom ? Math.ceil(marginTop) : Math.floor(marginTop)) + "px"
3195  element.style.marginTop = marginAttr;
3196 }
3197}
3198ASPx.ClearVerticalMargins = function(element) {
3199 element.style.marginTop = "";
3200 element.style.marginBottom = "";
3201}
3202ASPx.AdjustHeightInContainer = function(container) {
3203 var height = container.offsetHeight - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(container);
3204 for(var i = 0; i < container.childNodes.length; i++) {
3205  var element = container.childNodes[i];
3206  if(!element.offsetHeight) continue;
3207  ASPx.ClearHeight(element);
3208 }
3209 var elements = [];
3210 var childrenHeight = 0;
3211 for(var i = 0; i < container.childNodes.length; i++) {
3212  var element = container.childNodes[i];
3213  if(!element.offsetHeight) continue;
3214  childrenHeight += element.offsetHeight + ASPx.GetTopBottomMargins(element);
3215  elements.push(element);
3216 }
3217 if(elements.length > 0 && childrenHeight < height) {
3218  var correctedHeight = 0;
3219  for(var i = 0; i < elements.length; i++) {
3220   var elementHeight = 0;
3221   if(i < elements.length - 1){
3222    var elementHeight = Math.floor(height / elements.length);
3223    correctedHeight += elementHeight;
3224   }
3225   else{
3226    var elementHeight = height - correctedHeight;
3227    if(elementHeight < 0) elementHeight = 0;
3228   }
3229   adjustHeightCore(elements[i], elementHeight);
3230  }
3231 }
3232}
3233ASPx.AdjustHeight = function(element) {
3234 ASPx.ClearHeight(element);
3235 var parentElement = element.parentNode;
3236 var height = parentElement.offsetHeight - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(parentElement);
3237 adjustHeightCore(element, height);
3238}
3239function adjustHeightCore(element, height) {
3240 var height = height - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(element);
3241 if(height < 0) height = 0;
3242 element.style.height = height + "px";
3243}
3244ASPx.ClearHeight = function(element) {
3245 element.style.height = "";
3246}
3247ASPx.ShrinkWrappedTextInContainer = function(container) {
3248 if(!container) return;
3249 for(var i = 0; i < container.childNodes.length; i++){
3250  var child = container.childNodes[i];
3251  if(child.style && ASPx.IsTextWrapped(child)) {
3252   Attr.ChangeStyleAttribute(child, "width", "1px");
3253   child.shrinkedTextContainer = true;
3254  }
3255 }
3256}
3257ASPx.AdjustWrappedTextInContainer = function(container) {
3258 if(!container) return;
3259 var textContainer, leftWidth = 0, rightWidth = 0;
3260 for(var i = 0; i < container.childNodes.length; i++){
3261  var child = container.childNodes[i];
3262  if(child.tagName === "BR")
3263   return;
3264  if(!child.tagName)
3265   continue;
3266  if(child.tagName !== "IMG"){
3267   textContainer = child;
3268   if(ASPx.IsTextWrapped(textContainer)){
3269    if(!textContainer.shrinkedTextContainer)
3270     textContainer.style.width = "";
3271    textContainer.style.marginRight = "";
3272   }
3273  }
3274  else {
3275   if(child.offsetWidth === 0){
3276    Evt.AttachEventToElement(child, "load", function (evt) {
3277     ASPx.AdjustWrappedTextInContainer(container);
3278    });
3279    return;
3280   }
3281   var width = child.offsetWidth + ASPx.GetLeftRightMargins(child);
3282   if(textContainer)
3283    rightWidth += width;
3284   else
3285    leftWidth += width;
3286  }
3287 }
3288 if(textContainer && ASPx.IsTextWrapped(textContainer)) {
3289  var containerWidth = container.offsetWidth - ASPx.GetLeftRightBordersAndPaddingsSummaryValue(container);
3290  if(textContainer.shrinkedTextContainer) {
3291   Attr.RestoreStyleAttribute(textContainer, "width");
3292   Attr.ChangeStyleAttribute(container, "width", containerWidth + "px");
3293  }
3294  if(textContainer.offsetWidth + leftWidth + rightWidth >= containerWidth) {
3295    if(rightWidth > 0 && !textContainer.shrinkedTextContainer)
3296    textContainer.style.width = (containerWidth - rightWidth) + "px";
3297   else if(leftWidth > 0){
3298    if(ASPx.IsElementRightToLeft(container))
3299     textContainer.style.marginLeft = leftWidth + "px";
3300    else
3301     textContainer.style.marginRight = leftWidth + "px";
3302   }
3303  }
3304 }
3305}
3306ASPx.IsTextWrapped = function(element) {
3307 return element && ASPx.GetCurrentStyle(element).whiteSpace !== "nowrap";
3308}
3309ASPx.IsValidPosition = function(pos){
3310 return pos != ASPx.InvalidPosition && pos != -ASPx.InvalidPosition;
3311}
3312ASPx.getSpriteMainElement = function(element) {
3313 var cssClassMarker = "dx-acc";
3314 if(ASPx.ElementContainsCssClass(element, cssClassMarker))
3315  return element;
3316 if(element.parentNode && ASPx.ElementContainsCssClass(element.parentNode, cssClassMarker))
3317  return element.parentNode;
3318 return element;
3319}
3320ASPx.GetAbsoluteX = function(curEl){
3321 return ASPx.GetAbsolutePositionX(curEl);
3322}
3323ASPx.GetAbsoluteY = function(curEl){
3324 return ASPx.GetAbsolutePositionY(curEl);
3325}
3326ASPx.SetAbsoluteX = function(element, x){
3327 element.style.left = ASPx.PrepareClientPosForElement(x, element, true) + "px";
3328}
3329ASPx.SetAbsoluteY = function(element, y){
3330 element.style.top = ASPx.PrepareClientPosForElement(y, element, false) + "px";
3331}
3332ASPx.GetAbsolutePositionX = function(element){
3333 if(Browser.IE)
3334  return getAbsolutePositionX_IE(element);
3335 else if(Browser.Firefox && Browser.Version >= 3)
3336  return getAbsolutePositionX_FF3(element);
3337 else if(Browser.Opera)
3338  return getAbsolutePositionX_Opera(element);
3339 else if(Browser.NetscapeFamily && (!Browser.Firefox || Browser.Version < 3))
3340  return getAbsolutePositionX_NS(element);
3341 else if(Browser.WebKitFamily && Browser.WebKitTouchUI)
3342  return getAbsolutePositionX_Opera(element);
3343 else if(Browser.WebKitFamily || Browser.Edge)
3344  return getAbsolutePositionX_FF3(element);
3345 else
3346  return getAbsolutePositionX_Other(element);
3347}
3348function getAbsolutePositionX_Opera(curEl){
3349 var isFirstCycle = true;
3350 var pos = getAbsoluteScrollOffset_OperaFF(curEl, true);
3351 while(curEl != null) {
3352  pos += curEl.offsetLeft;
3353  if(!isFirstCycle)
3354   pos -= curEl.scrollLeft;
3355  curEl = curEl.offsetParent;
3356  isFirstCycle = false;
3357 }
3358 pos += document.body.scrollLeft;
3359 return pos;
3360}
3361function getAbsolutePositionX_IE(element){
3362 if(element == null || Browser.IE && element.parentNode == null) return 0; 
3363 return element.getBoundingClientRect().left + ASPx.GetDocumentScrollLeft();
3364}
3365function getAbsolutePositionX_FF3(element){
3366 if(element == null) return 0;
3367 var x = element.getBoundingClientRect().left + ASPx.GetDocumentScrollLeft();
3368 return Math.round(x);
3369}
3370function getAbsolutePositionX_NS(curEl){
3371 var pos = getAbsoluteScrollOffset_OperaFF(curEl, true);
3372 var isFirstCycle = true;
3373 while(curEl != null) {
3374  pos += curEl.offsetLeft;
3375  if(!isFirstCycle && curEl.offsetParent != null)
3376   pos -= curEl.scrollLeft;
3377  if(!isFirstCycle && Browser.Firefox){
3378   var style = ASPx.GetCurrentStyle(curEl);
3379   if(curEl.tagName == "DIV" && style.overflow != "visible")
3380    pos += ASPx.PxToInt(style.borderLeftWidth);
3381  }
3382  isFirstCycle = false;
3383  curEl = curEl.offsetParent;
3384 }
3385 return pos;
3386}
3387function getAbsolutePositionX_Safari(curEl){
3388 var pos = getAbsoluteScrollOffset_WebKit(curEl, true);
3389 var isSafariVerNonLessThan3OrChrome = Browser.Safari && Browser.Version >= 3 || Browser.Chrome;
3390 if(curEl != null){
3391  var isFirstCycle = true;
3392  if(isSafariVerNonLessThan3OrChrome && curEl.tagName == "TD") {
3393   pos += curEl.offsetLeft;
3394   curEl = curEl.offsetParent;
3395   isFirstCycle = false;
3396  }
3397  var hasNonStaticElement = false;
3398  while (curEl != null) {
3399   pos += curEl.offsetLeft;
3400   var style = ASPx.GetCurrentStyle(curEl);
3401   var isNonStatic = style.position !== "" && style.position !== "static";
3402   if(isNonStatic)
3403    hasNonStaticElement = true;
3404   var safariDisplayTable = Browser.Safari && Browser.Version >= 8 && style.display === "table";
3405   var posDiv = curEl.tagName == "DIV" && isNonStatic && !safariDisplayTable;
3406   if(!isFirstCycle && (curEl.tagName == "TD" || curEl.tagName == "TABLE" || posDiv))
3407    pos += curEl.clientLeft;
3408   isFirstCycle = false;
3409   curEl = curEl.offsetParent;
3410  }
3411  if(!hasNonStaticElement && (document.documentElement.style.position === "" || document.documentElement.style.position === "static"))
3412   pos += document.documentElement.offsetLeft;
3413 }
3414 return pos;
3415}
3416function getAbsolutePositionX_Other(curEl){
3417 var pos = 0;
3418 var isFirstCycle = true;
3419 while(curEl != null) {
3420  pos += curEl.offsetLeft;
3421  if(!isFirstCycle && curEl.offsetParent != null)
3422   pos -= curEl.scrollLeft;
3423  isFirstCycle = false;
3424  curEl = curEl.offsetParent;
3425 }
3426 return pos;
3427}
3428ASPx.GetAbsolutePositionY = function(element){
3429 if(Browser.IE)
3430  return getAbsolutePositionY_IE(element);
3431 else if(Browser.Firefox && Browser.Version >= 3)
3432  return getAbsolutePositionY_FF3(element);
3433 else if(Browser.Opera)
3434  return getAbsolutePositionY_Opera(element);
3435 else if(Browser.NetscapeFamily && (!Browser.Firefox || Browser.Version < 3))
3436  return getAbsolutePositionY_NS(element);
3437 else if(Browser.WebKitFamily && Browser.WebKitTouchUI)
3438  return getAbsolutePositionY_Opera(element);
3439 else if(Browser.WebKitFamily || Browser.Edge)
3440  return getAbsolutePositionY_FF3(element);
3441 else
3442  return getAbsolutePositionY_Other(element);
3443}
3444function getAbsolutePositionY_Opera(curEl){
3445 var isFirstCycle = true;
3446 if(curEl && curEl.tagName == "TR" && curEl.cells.length > 0)
3447  curEl = curEl.cells[0];
3448 var pos = getAbsoluteScrollOffset_OperaFF(curEl, false);
3449 while(curEl != null) {
3450  pos += curEl.offsetTop;
3451  if(!isFirstCycle)
3452   pos -= curEl.scrollTop;
3453  curEl = curEl.offsetParent;
3454  isFirstCycle = false;
3455 }
3456 pos += document.body.scrollTop;
3457 return pos;
3458}
3459function getAbsolutePositionY_IE(element){
3460 if(element == null || Browser.IE && element.parentNode == null) return 0; 
3461 return element.getBoundingClientRect().top + ASPx.GetDocumentScrollTop();
3462}
3463function getAbsolutePositionY_FF3(element){
3464 if(element == null) return 0;
3465 var y = element.getBoundingClientRect().top + ASPx.GetDocumentScrollTop();
3466 return Math.round(y);
3467}
3468function getAbsolutePositionY_NS(curEl){
3469 var pos = getAbsoluteScrollOffset_OperaFF(curEl, false);
3470 var isFirstCycle = true;
3471 while(curEl != null) {
3472  pos += curEl.offsetTop;
3473  if(!isFirstCycle && curEl.offsetParent != null)
3474   pos -= curEl.scrollTop;
3475  if(!isFirstCycle && Browser.Firefox){
3476   var style = ASPx.GetCurrentStyle(curEl);
3477   if(curEl.tagName == "DIV" && style.overflow != "visible")
3478    pos += ASPx.PxToInt(style.borderTopWidth);
3479  }
3480  isFirstCycle = false;
3481  curEl = curEl.offsetParent;
3482 }
3483 return pos;
3484}
3485var WebKit3TDRealInfo = {
3486 GetOffsetTop: function(tdElement){
3487  switch(ASPx.GetCurrentStyle(tdElement).verticalAlign){
3488   case "middle":
3489    return Math.round(tdElement.offsetTop - (tdElement.offsetHeight - tdElement.clientHeight )/2 + tdElement.clientTop);
3490   case "bottom":
3491    return tdElement.offsetTop - tdElement.offsetHeight + tdElement.clientHeight + tdElement.clientTop;
3492  }
3493  return tdElement.offsetTop;
3494 },
3495 GetClientHeight: function(tdElement){
3496  var valign = ASPx.GetCurrentStyle(tdElement).verticalAlign;
3497  switch(valign){
3498   case "middle":
3499    return tdElement.clientHeight + tdElement.offsetTop * 2;
3500   case "top":
3501    return tdElement.offsetHeight - tdElement.clientTop * 2;
3502   case "bottom":
3503    return tdElement.clientHeight + tdElement.offsetTop;
3504  }
3505  return tdElement.clientHeight;
3506 }
3507}
3508function getAbsolutePositionY_Safari(curEl){
3509 var pos = getAbsoluteScrollOffset_WebKit(curEl, false);
3510 var isSafariVerNonLessThan3OrChrome = Browser.Safari && Browser.Version >= 3 || Browser.Chrome;
3511 if(curEl != null){
3512  var isFirstCycle = true;
3513  if(isSafariVerNonLessThan3OrChrome && curEl.tagName == "TD") {
3514   pos += WebKit3TDRealInfo.GetOffsetTop(curEl);
3515   curEl = curEl.offsetParent;
3516   isFirstCycle = false;
3517  }
3518  var hasNonStaticElement = false;
3519  while (curEl != null) {
3520   pos += curEl.offsetTop;
3521   var style = ASPx.GetCurrentStyle(curEl);
3522   var isNonStatic = style.position !== "" && style.position !== "static";
3523   if(isNonStatic)
3524    hasNonStaticElement = true;
3525   var safariDisplayTable = Browser.Safari && Browser.Version >= 8 && style.display === "table";
3526   var posDiv = curEl.tagName == "DIV" && isNonStatic && !safariDisplayTable;
3527   if(!isFirstCycle && (curEl.tagName == "TD" || curEl.tagName == "TABLE" || posDiv))
3528    pos += curEl.clientTop;
3529   isFirstCycle = false;
3530   curEl = curEl.offsetParent;
3531  }
3532  if(!hasNonStaticElement && (document.documentElement.style.position === "" || document.documentElement.style.position === "static"))
3533   pos += document.documentElement.offsetTop;
3534 }
3535 return pos;
3536}
3537function getAbsoluteScrollOffset_OperaFF(curEl, isX) {
3538 var pos = 0;   
3539 var isFirstCycle = true;
3540 while(curEl != null) {
3541  if(curEl.tagName == "BODY")
3542   break;
3543  var style = ASPx.GetCurrentStyle(curEl);
3544  if(style.position == "absolute")
3545   break;
3546  if(!isFirstCycle && curEl.tagName == "DIV" && (style.position == "" || style.position == "static"))
3547   pos -= isX ? curEl.scrollLeft : curEl.scrollTop;
3548  curEl = curEl.parentNode;
3549  isFirstCycle = false;
3550 }
3551 return pos; 
3552}
3553function getAbsoluteScrollOffset_WebKit(curEl, isX) {
3554 var pos = 0;   
3555 var isFirstCycle = true;
3556 var step = 0;
3557 var absoluteWasFoundAtStep = -1;
3558 var isThereFixedParent = false;
3559 while(curEl != null) {
3560  if(curEl.tagName == "BODY")
3561   break;
3562  var style = ASPx.GetCurrentStyle(curEl);
3563  var positionIsDefault = style.position == "" || style.position == "static";
3564  var absoluteWasFoundAtPreviousStep = absoluteWasFoundAtStep >= 0 && absoluteWasFoundAtStep < step;
3565  var canHaveScrolls = curEl.tagName == "DIV" || curEl.tagName == "SECTION" || curEl.tagName == "FORM";
3566  if(!isFirstCycle && canHaveScrolls && (!positionIsDefault || !absoluteWasFoundAtPreviousStep))
3567   pos -= isX ? curEl.scrollLeft : curEl.scrollTop;
3568  if(style.position == "absolute")
3569   absoluteWasFoundAtStep = step;
3570  else if(style.position == "relative")
3571   absoluteWasFoundAtStep = -1;
3572  else if(style.position == "fixed")
3573   isThereFixedParent = true;
3574  curEl = curEl.parentNode;
3575  isFirstCycle = false;
3576  step ++;
3577 }
3578 if(isThereFixedParent)
3579  pos += isX ? ASPx.GetDocumentScrollLeft() : ASPx.GetDocumentScrollTop();
3580 return pos; 
3581}
3582function getAbsolutePositionY_Other(curEl){
3583 var pos = 0;
3584 var isFirstCycle = true;
3585 while(curEl != null) {
3586  pos += curEl.offsetTop;
3587  if(!isFirstCycle && curEl.offsetParent != null)
3588   pos -= curEl.scrollTop;
3589  isFirstCycle = false;
3590  curEl = curEl.offsetParent;
3591 }
3592 return pos;
3593}
3594function createElementMock(element) {
3595 var div = document.createElement('DIV');
3596 div.style.top = "0px";
3597 div.style.left = "0px";
3598 div.visibility = "hidden";
3599 div.style.position = ASPx.GetCurrentStyle(element).position;
3600 return div;
3601}
3602ASPx.PrepareClientPosElementForOtherParent = function(pos, element, otherParent, isX) {
3603 if(element.parentNode == otherParent)
3604  return ASPx.PrepareClientPosForElement(pos, element, isX);
3605 var elementMock = createElementMock(element);
3606 otherParent.appendChild(elementMock); 
3607 var preparedPos = ASPx.PrepareClientPosForElement(pos, elementMock, isX);
3608 otherParent.removeChild(elementMock);
3609 return preparedPos;
3610}
3611ASPx.PrepareClientPosForElement = function(pos, element, isX) {
3612 pos -= ASPx.GetPositionElementOffset(element, isX);
3613 return pos;
3614}
3615function getExperimentalPositionOffset(element, isX) {
3616 var div = createElementMock(element);
3617 if(div.style.position == "static")
3618  div.style.position = "absolute";
3619 element.parentNode.appendChild(div); 
3620 var realPos = isX ? ASPx.GetAbsoluteX(div) : ASPx.GetAbsoluteY(div);
3621 element.parentNode.removeChild(div);
3622 return Math.round(realPos);
3623}
3624ASPx.GetPositionElementOffset = function(element, isX) {
3625 return getExperimentalPositionOffset(element, isX);
3626}
3627function getPositionElementOffsetCore(element, isX) {
3628 var curEl = element.offsetParent;
3629 var offset = 0;
3630 var scroll = 0;
3631 var isThereFixedParent = false;
3632 var isFixed = false;
3633 var hasDisplayTableParent = false;
3634 var position = "";
3635 while(curEl != null) {
3636  var tagName = curEl.tagName;
3637  if(tagName == "HTML"){
3638   break;
3639  }
3640  if(tagName == "BODY"){
3641   if(!Browser.Opera && !Browser.Chrome && !Browser.Edge){
3642    var style = ASPx.GetCurrentStyle(curEl);
3643    if(style.position != "" && style.position != "static"){
3644     offset += ASPx.PxToInt(isX ? style.left : style.top);
3645     offset += ASPx.PxToInt(isX ? style.marginLeft : style.marginTop);
3646    }
3647   }
3648   break;
3649  }
3650  var style = ASPx.GetCurrentStyle(curEl);
3651  isFixed = style.position == "fixed";
3652  if(isFixed) {
3653   isThereFixedParent = true;
3654   if(Browser.IE) 
3655    return getExperimentalPositionOffset(element, isX); 
3656  }
3657  hasDisplayTableParent = style.display == "table" && (style.position == "absolute" || style.position == "relative");
3658  if(hasDisplayTableParent && Browser.IE)
3659   return getExperimentalPositionOffset(element, isX);
3660  if(style.position == "absolute" || isFixed || style.position == "relative") {
3661   offset += isX ? curEl.offsetLeft : curEl.offsetTop;
3662   offset += ASPx.PxToInt(isX ? style.borderLeftWidth : style.borderTopWidth);
3663  }
3664  if(style.position == "relative") 
3665   scroll += getElementChainScroll(curEl, curEl.offsetParent, isX);
3666  scroll += isX ? curEl.scrollLeft : curEl.scrollTop;
3667  curEl = curEl.offsetParent;
3668 }
3669 offset -= scroll; 
3670 if((Browser.IE || Browser.Firefox && Browser.Version >= 3 || Browser.WebKitFamily || Browser.Edge) && isThereFixedParent)
3671  offset += isX ? ASPx.GetDocumentScrollLeft() : ASPx.GetDocumentScrollTop();
3672 return offset;
3673}
3674function getElementChainScroll(startElement, endElement, isX){
3675 var curEl = startElement.parentNode;
3676 var scroll = 0;
3677 while(curEl != endElement){
3678  scroll += isX ? curEl.scrollLeft : curEl.scrollTop;
3679  curEl = curEl.parentNode;
3680 }
3681 return scroll;
3682}
3683ASPx.GetSizeOfText = function(text, textCss) {
3684 var testContainer = document.createElement("tester");
3685 var defaultLineHeight = ASPx.Browser.Firefox ? "1" : "";
3686 testContainer.style.fontSize = textCss.fontSize;
3687 testContainer.style.fontFamily = textCss.fontFamily;
3688 testContainer.style.fontWeight = textCss.fontWeight;
3689 testContainer.style.letterSpacing = textCss.letterSpacing;
3690 testContainer.style.lineHeight = textCss.lineHeight || defaultLineHeight;
3691 testContainer.style.position = "absolute";
3692 testContainer.style.top = ASPx.InvalidPosition + "px";
3693 testContainer.style.left = ASPx.InvalidPosition + "px";
3694 testContainer.style.width = "auto";
3695 testContainer.style.whiteSpace = "nowrap";
3696 testContainer.appendChild(document.createTextNode(text));
3697 var testElement = document.body.appendChild(testContainer);
3698 var size = {
3699  "width": testElement.offsetWidth,
3700  "height": testElement.offsetHeight
3701 };
3702 document.body.removeChild(testElement);
3703 return size;
3704}
3705ASPx.PointToPixel = function(points, addPx) {  
3706 var result = 0;
3707 try {
3708  var indexOfPt = points.toLowerCase().indexOf("pt");
3709  if(indexOfPt > -1)
3710   result = parseInt(points.substr(0, indexOfPt)) * 96 / 72;
3711  else
3712   result = parseInt(points) * 96 / 72;
3713  if(addPx)
3714   result = result + "px";
3715 } catch(e) {}
3716 return result;
3717}
3718ASPx.PixelToPoint = function(pixels, addPt) { 
3719 var result = 0;
3720 try {
3721  var indexOfPx = pixels.toLowerCase().indexOf("px");
3722  if(indexOfPx > -1)
3723   result = parseInt(pixels.substr(0, indexOfPx)) * 72 / 96;
3724  else
3725   result = parseInt(pixels) * 72 / 96;
3726  if(addPt)
3727   result = result + "pt";
3728 } catch(e) {}
3729 return result;         
3730}
3731ASPx.PxToInt = function(px) {
3732 return pxToNumber(px, parseInt);
3733}
3734ASPx.PxToFloat = function(px) {
3735 return pxToNumber(px, parseFloat);
3736}
3737function pxToNumber(px, parseFunction) {
3738 var result = 0;
3739 if(px != null && px != "") {
3740  try {
3741   var indexOfPx = px.indexOf("px");
3742   if(indexOfPx > -1)
3743    result = parseFunction(px.substr(0, indexOfPx));
3744  } catch(e) { }
3745 }
3746 return result;
3747}
3748ASPx.PercentageToFloat = function(perc) {
3749 var result = 0;
3750 if(perc != null && perc != "") {
3751  try {
3752   var indexOfPerc = perc.indexOf("%");
3753   if(indexOfPerc > -1)
3754    result = parseFloat(perc.substr(0, indexOfPerc)) / 100;
3755  } catch(e) { }
3756 }
3757 return result;
3758}
3759ASPx.CreateGuid = function() {
3760 return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 
3761   var r = Math.random()*16|0,v=c=='x'?r:r&0x3|0x8;
3762  return v.toString(16);
3763 });
3764}
3765ASPx.GetLeftRightBordersAndPaddingsSummaryValue = function(element, currentStyle) {
3766 return ASPx.GetLeftRightPaddings(element, currentStyle) + ASPx.GetHorizontalBordersWidth(element, currentStyle);
3767}
3768ASPx.GetTopBottomBordersAndPaddingsSummaryValue = function(element, currentStyle) {
3769 return ASPx.GetTopBottomPaddings(element, currentStyle) + ASPx.GetVerticalBordersWidth(element, currentStyle);
3770}
3771ASPx.GetVerticalBordersWidth = function(element, style) {
3772 if(!ASPx.IsExists(style))
3773  style = (Browser.IE && Browser.MajorVersion != 9 && window.getComputedStyle) ? window.getComputedStyle(element) : ASPx.GetCurrentStyle(element);
3774 var res = 0;
3775 if(style.borderTopStyle != "none") {
3776  res += ASPx.PxToFloat(style.borderTopWidth);
3777  if(Browser.IE && Browser.MajorVersion < 9)
3778   res += getIe8BorderWidthFromText(style.borderTopWidth);
3779 }
3780 if(style.borderBottomStyle != "none") {
3781  res += ASPx.PxToFloat(style.borderBottomWidth);
3782  if(Browser.IE && Browser.MajorVersion < 9)
3783   res += getIe8BorderWidthFromText(style.borderBottomWidth);
3784 }
3785 return res;
3786}
3787ASPx.GetHorizontalBordersWidth = function(element, style) {
3788 if(!ASPx.IsExists(style))
3789  style = (Browser.IE && window.getComputedStyle) ? window.getComputedStyle(element) : ASPx.GetCurrentStyle(element);
3790 var res = 0;
3791 if(style.borderLeftStyle != "none") {
3792  res += ASPx.PxToFloat(style.borderLeftWidth);
3793  if(Browser.IE && Browser.MajorVersion < 9)
3794   res += getIe8BorderWidthFromText(style.borderLeftWidth);
3795 }
3796 if(style.borderRightStyle != "none") {
3797  res += ASPx.PxToFloat(style.borderRightWidth);
3798  if(Browser.IE && Browser.MajorVersion < 9)
3799   res += getIe8BorderWidthFromText(style.borderRightWidth);
3800 }
3801 return res;
3802}
3803function getIe8BorderWidthFromText(textWidth) {
3804 var availableWidth = { "thin": 1, "medium" : 3, "thick": 5 };
3805 var width = availableWidth[textWidth];
3806 return width ? width : 0;
3807}
3808ASPx.GetTopBottomPaddings = function(element, style) {
3809 var currentStyle = style ? style : ASPx.GetCurrentStyle(element);
3810 return ASPx.PxToInt(currentStyle.paddingTop) + ASPx.PxToInt(currentStyle.paddingBottom);
3811}
3812ASPx.GetLeftRightPaddings = function(element, style) {
3813 var currentStyle = style ? style : ASPx.GetCurrentStyle(element);
3814 return ASPx.PxToInt(currentStyle.paddingLeft) + ASPx.PxToInt(currentStyle.paddingRight);
3815}
3816ASPx.GetTopBottomMargins = function(element, style) {
3817 var currentStyle = style ? style : ASPx.GetCurrentStyle(element);
3818 return ASPx.PxToInt(currentStyle.marginTop) + ASPx.PxToInt(currentStyle.marginBottom);
3819}
3820ASPx.GetLeftRightMargins = function(element, style) {
3821 var currentStyle = style ? style : ASPx.GetCurrentStyle(element);
3822 return ASPx.PxToInt(currentStyle.marginLeft) + ASPx.PxToInt(currentStyle.marginRight);
3823}
3824ASPx.GetClearClientWidth = function(element) {
3825 return element.offsetWidth - ASPx.GetLeftRightBordersAndPaddingsSummaryValue(element);
3826}
3827ASPx.GetClearClientHeight = function(element) {
3828 return element.offsetHeight - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(element);
3829}
3830ASPx.SetOffsetWidth = function(element, widthValue, currentStyle) {
3831 if(!ASPx.IsExists(currentStyle))
3832  currentStyle = ASPx.GetCurrentStyle(element);
3833 var value = widthValue - ASPx.PxToInt(currentStyle.marginLeft) - ASPx.PxToInt(currentStyle.marginRight);
3834  value -= ASPx.GetLeftRightBordersAndPaddingsSummaryValue(element, currentStyle);
3835 if(value > -1)
3836  element.style.width = value + "px";
3837}
3838ASPx.SetOffsetHeight = function(element, heightValue, currentStyle) {
3839 if(!ASPx.IsExists(currentStyle))
3840  currentStyle = ASPx.GetCurrentStyle(element);
3841 var value = heightValue - ASPx.PxToInt(currentStyle.marginTop) - ASPx.PxToInt(currentStyle.marginBottom);
3842  value -= ASPx.GetTopBottomBordersAndPaddingsSummaryValue(element, currentStyle);
3843 if(value > -1)
3844  element.style.height = value + "px";
3845}
3846ASPx.FindOffsetParent = function(element) {
3847 var currentElement = element.parentNode;
3848 while(ASPx.IsExistsElement(currentElement) && currentElement.tagName != "BODY") {
3849  if(currentElement.offsetWidth > 0 && currentElement.offsetHeight > 0)
3850   return currentElement;
3851  currentElement = currentElement.parentNode;
3852 }
3853 return document.body;
3854}
3855ASPx.GetDocumentScrollTop = function(){
3856 var isScrollBodyIE = Browser.IE && ASPx.GetCurrentStyle(document.body).overflow == "hidden" && document.body.scrollTop > 0;
3857 if(Browser.WebKitFamily || Browser.Edge || isScrollBodyIE) {
3858  if(Browser.MacOSMobilePlatform) 
3859   return window.pageYOffset;
3860  else 
3861   return document.body.scrollTop;
3862 }
3863 else
3864  return document.documentElement.scrollTop;
3865}
3866ASPx.SetDocumentScrollTop = function(scrollTop) {
3867 if(Browser.WebKitFamily || Browser.Edge) {
3868  if(Browser.MacOSMobilePlatform) 
3869   window.pageYOffset = scrollTop;
3870  else 
3871   document.body.scrollTop = scrollTop;
3872 }
3873 else
3874  document.documentElement.scrollTop = scrollTop;
3875}
3876ASPx.GetDocumentScrollLeft = function(){
3877 var isScrollBodyIE = Browser.IE && ASPx.GetCurrentStyle(document.body).overflow == "hidden" && document.body.scrollLeft > 0;
3878 if(Browser.WebKitFamily || Browser.Edge || isScrollBodyIE || Browser.Opera)
3879  return document.body.scrollLeft;
3880 return document.documentElement.scrollLeft;
3881}
3882ASPx.SetDocumentScrollLeft = function(scrollLeft) {
3883 if(Browser.WebKitFamily || Browser.Edge) {
3884  if(Browser.MacOSMobilePlatform)
3885   window.pageXOffset = scrollLeft;
3886  else 
3887   document.body.scrollLeft = scrollLeft;
3888 }
3889 else
3890  document.documentElement.scrollLeft = scrollLeft;
3891}
3892ASPx.GetDocumentClientWidth = function(){
3893 if(document.documentElement.clientWidth == 0)
3894  return document.body.clientWidth;
3895 else
3896  return document.documentElement.clientWidth;
3897}
3898ASPx.GetDocumentClientHeight = function() {
3899 if(Browser.Firefox && window.innerHeight - document.documentElement.clientHeight > ASPx.GetVerticalScrollBarWidth()) {
3900  return window.innerHeight;
3901 } else if(Browser.Opera && Browser.Version < 9.6 || document.documentElement.clientHeight == 0) {
3902   return document.body.clientHeight
3903 }
3904 return document.documentElement.clientHeight;
3905}
3906ASPx.GetDocumentWidth = function(){
3907 var bodyWidth = document.body.offsetWidth;
3908 var docWidth = Browser.IE ? document.documentElement.clientWidth : document.documentElement.offsetWidth;
3909 var bodyScrollWidth = document.body.scrollWidth;
3910 var docScrollWidth = document.documentElement.scrollWidth;
3911 return getMaxDimensionOf(bodyWidth, docWidth, bodyScrollWidth, docScrollWidth);
3912}
3913ASPx.GetDocumentHeight = function(){
3914 var bodyHeight = document.body.offsetHeight;
3915 var docHeight = Browser.IE ? document.documentElement.clientHeight : document.documentElement.offsetHeight;
3916 var bodyScrollHeight = document.body.scrollHeight;
3917 var docScrollHeight = document.documentElement.scrollHeight;
3918 var maxHeight = getMaxDimensionOf(bodyHeight, docHeight, bodyScrollHeight, docScrollHeight);
3919 if(Browser.Opera && Browser.Version >= 9.6){
3920  if(Browser.Version < 10)
3921   maxHeight = getMaxDimensionOf(bodyHeight, docHeight, bodyScrollHeight);
3922  var visibleHeightOfDocument = document.documentElement.clientHeight;
3923  if(maxHeight > visibleHeightOfDocument)
3924   maxHeight = getMaxDimensionOf(window.outerHeight, maxHeight);
3925  else
3926   maxHeight = document.documentElement.clientHeight;
3927  return maxHeight;
3928 }
3929 return maxHeight;
3930}
3931ASPx.GetDocumentMaxClientWidth = function(){
3932 var bodyWidth = document.body.offsetWidth;
3933 var docWidth = document.documentElement.offsetWidth;
3934 var docClientWidth = document.documentElement.clientWidth;
3935 return getMaxDimensionOf(bodyWidth, docWidth, docClientWidth);
3936}
3937ASPx.GetDocumentMaxClientHeight = function(){
3938 var bodyHeight = document.body.offsetHeight;
3939 var docHeight = document.documentElement.offsetHeight;
3940 var docClientHeight = document.documentElement.clientHeight;
3941 return getMaxDimensionOf(bodyHeight, docHeight, docClientHeight);
3942}
3943ASPx.verticalScrollIsNotHidden = null;
3944ASPx.horizontalScrollIsNotHidden = null;
3945ASPx.GetVerticalScrollIsNotHidden = function() {
3946 if(!ASPx.IsExists(ASPx.verticalScrollIsNotHidden))
3947  ASPx.verticalScrollIsNotHidden = ASPx.GetCurrentStyle(document.body).overflowY !== "hidden"
3948   && ASPx.GetCurrentStyle(document.documentElement).overflowY !== "hidden";
3949 return ASPx.verticalScrollIsNotHidden;
3950}
3951ASPx.GetHorizontalScrollIsNotHidden = function() {
3952 if(!ASPx.IsExists(ASPx.horizontalScrollIsNotHidden))
3953  ASPx.horizontalScrollIsNotHidden = ASPx.GetCurrentStyle(document.body).overflowX !== "hidden"
3954   && ASPx.GetCurrentStyle(document.documentElement).overflowX !== "hidden";
3955 return ASPx.horizontalScrollIsNotHidden;
3956}
3957ASPx.GetCurrentDocumentWidth = function() {
3958 var result = ASPx.GetDocumentClientWidth();
3959 if(!ASPx.Browser.Safari && ASPx.GetVerticalScrollIsNotHidden() && ASPx.GetDocumentHeight() > ASPx.GetDocumentClientHeight())
3960  result += ASPx.GetVerticalScrollBarWidth();
3961 return result;
3962}
3963ASPx.GetCurrentDocumentHeight = function() {
3964 var result = ASPx.GetDocumentClientHeight();
3965 if(!ASPx.Browser.Safari && ASPx.GetHorizontalScrollIsNotHidden() && ASPx.GetDocumentWidth() > ASPx.GetDocumentClientWidth())
3966  result += ASPx.GetVerticalScrollBarWidth();
3967 return result;
3968}
3969function getMaxDimensionOf(){
3970 var max = ASPx.InvalidDimension;
3971 for(var i = 0; i < arguments.length; i++){
3972  if(max < arguments[i])
3973   max = arguments[i];
3974 }
3975 return max;
3976}
3977ASPx.GetClientLeft = function(element){
3978 return ASPx.IsExists(element.clientLeft) ? element.clientLeft : (element.offsetWidth - element.clientWidth) / 2;
3979}
3980ASPx.GetClientTop = function(element){
3981 return ASPx.IsExists(element.clientTop) ? element.clientTop : (element.offsetHeight - element.clientHeight) / 2;
3982}
3983ASPx.SetStyles = function(element, styles, makeImportant) {
3984 if(ASPx.IsExists(styles.cssText))
3985  element.style.cssText = styles.cssText;
3986 if(ASPx.IsExists(styles.className))
3987  element.className = styles.className;
3988 for(var property in styles) {
3989  if(!styles.hasOwnProperty(property))
3990   continue;
3991  var value = styles[property];
3992  switch (property) {
3993   case "cssText":
3994   case "className":
3995    break;
3996   case "float":
3997    ASPx.SetElementFloat(element, value);
3998    break;
3999   case "opacity":
4000    ASPx.SetElementOpacity(element, value);
4001    break;
4002   case "zIndex":
4003    ASPx.SetStylesCore(element, property, value, makeImportant);
4004    break;
4005   case "fontWeight":
4006    if(ASPx.Browser.IE && ASPx.Browser.Version < 9 && typeof(styles[property]) == "number")
4007     value = styles[property].toString();
4008   default:
4009    ASPx.SetStylesCore(element, property, value + (typeof (value) == "number" ? "px" : ""), makeImportant);
4010  }
4011 }
4012}
4013ASPx.SetStylesCore = function(element, property, value, makeImportant) {
4014 if(makeImportant) {
4015  var index = property.search("[A-Z]");
4016  if(index != -1)
4017   property = property.replace(property.charAt(index), "-" + property.charAt(index).toLowerCase());
4018  if(element.style.setProperty)
4019   element.style.setProperty(property, value, "important");
4020  else 
4021   element.style.cssText += ";" + property + ":" + value + "!important";
4022 }
4023 else
4024  element.style[property] = value;
4025}
4026ASPx.RemoveBordersAndShadows = function(el) {
4027 if(!el || !el.style)
4028  return;
4029 el.style.borderWidth = 0;
4030 if(ASPx.IsExists(el.style.boxShadow))
4031  el.style.boxShadow = "none";
4032 else if(ASPx.IsExists(el.style.MozBoxShadow))
4033  el.style.MozBoxShadow = "none";
4034 else if(ASPx.IsExists(el.style.webkitBoxShadow))
4035  el.style.webkitBoxShadow = "none";
4036}
4037ASPx.GetCellSpacing = function(element) {
4038 var val = parseInt(element.cellSpacing);
4039 if(!isNaN(val)) return val;
4040 val = parseInt(ASPx.GetCurrentStyle(element).borderSpacing);
4041 if(!isNaN(val)) return val;
4042 return 0;
4043}
4044ASPx.GetInnerScrollPositions = function(element) {
4045 var scrolls = [];
4046 getInnerScrollPositionsCore(element, scrolls);
4047 return scrolls;
4048}
4049function getInnerScrollPositionsCore(element, scrolls) {
4050 for(var child = element.firstChild; child; child = child.nextSibling) {
4051  var scrollTop = child.scrollTop,
4052   scrollLeft = child.scrollLeft;
4053  if(scrollTop > 0 || scrollLeft > 0)
4054   scrolls.push([child, scrollTop, scrollLeft]);
4055  getInnerScrollPositionsCore(child, scrolls);
4056 }
4057}
4058ASPx.RestoreInnerScrollPositions = function(scrolls) {
4059 for(var i = 0, scrollArr; scrollArr = scrolls[i]; i++) {
4060  if(scrollArr[1] > 0)
4061   scrollArr[0].scrollTop = scrollArr[1];
4062  if(scrollArr[2] > 0)
4063   scrollArr[0].scrollLeft = scrollArr[2];
4064 }
4065}
4066ASPx.GetOuterScrollPosition = function(element) {
4067 while(element.tagName !== "BODY") {
4068  var scrollTop = element.scrollTop,
4069   scrollLeft = element.scrollLeft;
4070  if(scrollTop > 0 || scrollLeft > 0) {
4071   return {
4072    scrollTop: scrollTop,
4073    scrollLeft: scrollLeft,
4074    element: element
4075   };
4076  }
4077  element = element.parentNode;
4078 }
4079 return {
4080  scrollTop: ASPx.GetDocumentScrollTop(),
4081  scrollLeft: ASPx.GetDocumentScrollLeft()
4082 };
4083}
4084ASPx.RestoreOuterScrollPosition = function(scrollInfo) {
4085 if(scrollInfo.element) {
4086  if(scrollInfo.scrollTop > 0)
4087   scrollInfo.element.scrollTop = scrollInfo.scrollTop;
4088  if(scrollInfo.scrollLeft > 0)
4089   scrollInfo.element.scrollLeft = scrollInfo.scrollLeft;
4090 }
4091 else {
4092  if(scrollInfo.scrollTop > 0)
4093   ASPx.SetDocumentScrollTop(scrollInfo.scrollTop);
4094  if(scrollInfo.scrollLeft > 0)
4095   ASPx.SetDocumentScrollLeft(scrollInfo.scrollLeft);
4096 }
4097}
4098ASPx.ChangeElementContainer = function(element, container, savePreviousContainer) {
4099 if(element.parentNode != container) {
4100  var parentNode = element.parentNode;
4101  parentNode.removeChild(element);
4102  container.appendChild(element);
4103  if(savePreviousContainer)
4104   element.previousContainer = parentNode;
4105 }
4106}
4107ASPx.RestoreElementContainer = function(element) {
4108 if(element.previousContainer) {
4109  ASPx.ChangeElementContainer(element, element.previousContainer, false);
4110  element.previousContainer = null;
4111 }
4112}
4113ASPx.MoveChildrenToElement = function(sourceElement, destinationElement){
4114 while(sourceElement.childNodes.length > 0)
4115  destinationElement.appendChild(sourceElement.childNodes[0]);
4116}
4117ASPx.GetScriptCode = function(script) {
4118 var useFirstChildElement = Browser.Chrome && Browser.Version < 11 || Browser.Safari && Browser.Version < 5; 
4119 var text = useFirstChildElement ? script.firstChild.data : script.text;
4120 var comment = "<!--";
4121 var pos = text.indexOf(comment);
4122 if(pos > -1)
4123  text = text.substr(pos + comment.length);
4124 return text;
4125}
4126ASPx.AppendScript = function(script) {
4127 var parent = document.getElementsByTagName("head")[0];
4128 if(!parent)
4129  parent = document.body;
4130 if(parent)
4131  parent.appendChild(script);
4132}
4133function getFrame(frames, name) {
4134 if(frames[name])
4135  return frames[name];
4136 for(var i = 0; i < frames.length; i++) {
4137  try {
4138   var frame = frames[i];
4139   if(frame.name == name) 
4140    return frame; 
4141   frame = getFrame(frame.frames, name);
4142   if(frame != null)   
4143    return frame; 
4144  } catch(e) {
4145  } 
4146 }
4147 return null;
4148}
4149ASPx.IsValidElement = function(element) {
4150 if(!element) 
4151  return false;
4152 if(!(Browser.Firefox && Browser.Version < 4)) {
4153  if(element.ownerDocument && element.ownerDocument.body && element.ownerDocument.body.compareDocumentPosition)
4154   return element.ownerDocument.body.compareDocumentPosition(element) % 2 === 0;
4155 }
4156 if(!Browser.Opera && !(Browser.IE && Browser.Version < 9) && element.offsetParent && element.parentNode.tagName)
4157  return true;
4158 while(element != null){
4159  if(element.tagName == "BODY")
4160   return true;
4161  element = element.parentNode;
4162 }
4163 return false;
4164}
4165ASPx.IsValidElements = function(elements) {
4166 if(!elements)
4167  return false; 
4168 for(var i = 0; i < elements.length; i++) {
4169  if(elements[i] && !ASPx.IsValidElement(elements[i]))
4170   return false;
4171 }
4172 return true;
4173}
4174ASPx.IsExistsElement = function(element) {
4175 return element && ASPx.IsValidElement(element);
4176}
4177ASPx.CreateHtmlElementFromString = function(str) {
4178 var dummy = ASPx.CreateHtmlElement();
4179 dummy.innerHTML = str;
4180 return dummy.firstChild;
4181}
4182ASPx.CreateHtmlElement = function(tagName, styles) {
4183 var element = document.createElement(tagName || "DIV");
4184 if(styles)
4185  ASPx.SetStyles(element, styles);
4186 return element;
4187}
4188ASPx.RestoreElementOriginalWidth = function(element) {
4189 if(!ASPx.IsExistsElement(element)) 
4190  return;
4191 element.style.width = element.dxOrigWidth = ASPx.GetElementOriginalWidth(element);
4192}
4193ASPx.GetElementOriginalWidth = function(element) {
4194 if(!ASPx.IsExistsElement(element)) 
4195  return null;
4196 var width;
4197 if(!ASPx.IsExists(element.dxOrigWidth)) {
4198   width = String(element.style.width).length > 0
4199  ? element.style.width
4200  : element.offsetWidth + "px";
4201 } else {
4202  width = element.dxOrigWidth;
4203 }
4204 return width;
4205}
4206ASPx.DropElementOriginalWidth = function(element) {
4207 if(ASPx.IsExists(element.dxOrigWidth))
4208  element.dxOrigWidth = null;
4209}
4210ASPx.GetObjectKeys = function(obj) {
4211 if(!obj) return [ ];
4212 if(Object.keys)
4213  return Object.keys(obj);
4214 var keys = [ ];
4215 for(var key in obj) {
4216  if(obj.hasOwnProperty(key))
4217   keys.push(key);
4218 }
4219 return keys;
4220}
4221ASPx.ShowErrorAlert = function(message) {
4222 var textArea = document.createElement("TEXTAREA");
4223 textArea.innerHTML = message;
4224 message = textArea.value;
4225 if(ASPx.IsExists(message) && message !== "")
4226  alert(message);
4227};
4228ASPx.ShowKBErrorMessage = function(text, kbid) {
4229 var console = window.console;
4230 if(!console || !ASPx.IsFunction(console.error))
4231  return;
4232 console.error(text + "https://www.devexpress.com/kbid=" + kbid + ".");
4233};
4234ASPx.IsInteractiveControl = function(element, extremeParent) { 
4235 return Data.ArrayIndexOf(["A", "INPUT", "SELECT", "OPTION", "TEXTAREA", "BUTTON", "IFRAME"], element.tagName) > -1;
4236}
4237ASPx.IsUrlContainsClientScript = function(url) {
4238 return url.toLowerCase().indexOf("javascript:") !== -1;
4239}
4240Function.prototype.aspxBind = function(scope) {
4241 var func = this;
4242 return function() {
4243  return func.apply(scope, arguments);
4244 };
4245};
4246var FilteringUtils = { };
4247FilteringUtils.EventKeyCodeChangesTheInput = function(evt) {
4248 if(ASPx.IsPasteShortcut(evt))
4249  return true;
4250 else if(evt.ctrlKey && !evt.altKey)
4251  return false;
4252 if(ASPx.Browser.AndroidMobilePlatform || ASPx.Browser.MacOSMobilePlatform) return true; 
4253 var keyCode = ASPx.Evt.GetKeyCode(evt);
4254 var isSystemKey = ASPx.Key.Windows <= keyCode && keyCode <= ASPx.Key.ContextMenu;
4255 var isFKey = ASPx.Key.F1 <= keyCode && keyCode <= 127; 
4256 return ASPx.Key.Delete <= keyCode && !isSystemKey && !isFKey || keyCode == ASPx.Key.Backspace || keyCode == ASPx.Key.Space;
4257}
4258FilteringUtils.FormatCallbackArg = function(prefix, arg) {
4259 return (ASPx.IsExists(arg) ? prefix + "|" + arg.length + ';' + arg + ';' : "");
4260}
4261ASPx.FilteringUtils = FilteringUtils;
4262var FormatStringHelper = { };
4263FormatStringHelper.PlaceHolderTemplateStruct = function(startIndex, length, index, placeHolderString){
4264 this.startIndex = startIndex;
4265 this.realStartIndex = 0;
4266 this.length = length;
4267 this.realLength = 0;
4268 this.index = index;
4269 this.placeHolderString = placeHolderString;
4270}
4271FormatStringHelper.GetPlaceHolderTemplates = function(formatString){
4272 formatString = this.CollapseDoubleBrackets(formatString);
4273 var templates = this.CreatePlaceHolderTemplates(formatString);
4274 return templates;
4275}
4276FormatStringHelper.CreatePlaceHolderTemplates = function(formatString){
4277 var templates = [];
4278 var templateStrings = formatString.match(/{[^}]+}/g);
4279 if(templateStrings != null){
4280  var pos = 0;
4281  for(var i = 0; i < templateStrings.length; i++){
4282   var tempString = templateStrings[i];
4283   var startIndex = formatString.indexOf(tempString, pos);
4284   var length = tempString.length;
4285   var indexString = tempString.slice(1).match(/^[0-9]+/);
4286   var index = parseInt(indexString);
4287   templates.push(new this.PlaceHolderTemplateStruct(startIndex, length, index, tempString));
4288   pos = startIndex + length;
4289  }
4290 }
4291 return templates;
4292}
4293FormatStringHelper.CollapseDoubleBrackets = function(formatString){
4294 formatString = this.CollapseOpenDoubleBrackets(formatString);
4295 formatString = this.CollapseCloseDoubleBrackets(formatString);
4296 return formatString;
4297}
4298FormatStringHelper.CollapseOpenDoubleBrackets = function(formatString){
4299 return formatString.replace(/{{/g, "_");
4300}
4301FormatStringHelper.CollapseCloseDoubleBrackets = function(formatString){
4302 while(true){
4303  var index = formatString.lastIndexOf("}}");
4304  if(index == -1) 
4305   break;
4306  else
4307   formatString = formatString.substr(0, index) + "_" + formatString.substr(index + 2);
4308 }
4309 return formatString;
4310}
4311ASPx.FormatStringHelper = FormatStringHelper;
4312var StartWithFilteringUtils = { };
4313StartWithFilteringUtils.HighlightSuggestedText = function(input, suggestedText, control){
4314 if(this.NeedToLockAndoidKeyEvents(control))
4315  control.LockAndroidKeyEvents();
4316 var selInfo = ASPx.Selection.GetInfo(input);
4317 var currentTextLenght = ASPx.Str.GetCoincideCharCount(suggestedText, input.value, 
4318  function(text, filter) { 
4319   return text.indexOf(filter) == 0;
4320  });
4321 var suggestedTextLenght = suggestedText.length;
4322 var isSelected = selInfo.startPos == 0 && selInfo.endPos == currentTextLenght && 
4323  selInfo.endPos == suggestedTextLenght && input.value == suggestedText;
4324 if(!isSelected) { 
4325  input.value = suggestedText;
4326  if(this.NeedToLockAndoidKeyEvents(control)) {
4327   window.setTimeout(function() {
4328    this.SelectText(input, currentTextLenght, suggestedTextLenght);
4329    control.UnlockAndroidKeyEvents();
4330   }.aspxBind(this), control.adroidSamsungBugTimeout);
4331  } else
4332   this.SelectText(input, currentTextLenght, suggestedTextLenght);
4333 }
4334}
4335StartWithFilteringUtils.SelectText = function(input, startPos, stopPos) {
4336 if(startPos < stopPos)
4337  ASPx.Selection.Set(input, startPos, stopPos);
4338}
4339StartWithFilteringUtils.RollbackOneSuggestedChar = function(input){
4340 var currentText = input.value;
4341 var cutText = currentText.slice(0, -1);
4342 if(cutText != currentText)
4343  input.value = cutText;
4344}
4345StartWithFilteringUtils.NeedToLockAndoidKeyEvents = function(control) {
4346 return ASPx.Browser.AndroidMobilePlatform && control && control.LockAndroidKeyEvents;
4347}
4348ASPx.StartWithFilteringUtils = StartWithFilteringUtils;
4349var ContainsFilteringUtils = { };
4350ContainsFilteringUtils.ColumnSelectionStruct = function(index, startIndex, length){
4351 this.index = index;
4352 this.length = length;
4353 this.startIndex = startIndex;
4354}
4355ContainsFilteringUtils.IsFilterCrossPlaseHolder = function(filterStartIndex, filterEndIndex, template) {
4356 var left = Math.max(filterStartIndex, template.realStartIndex);
4357 var right = Math.min(filterEndIndex,  template.realStartIndex + template.realLength);
4358 return left < right;
4359}
4360ContainsFilteringUtils.GetColumnSelectionsForItem = function(itemValues, formatString, filterString) {
4361 if(formatString == "") 
4362  return this.GetSelectionForSingleColumnItem(itemValues, filterString); 
4363 var result = [];
4364 var formatedString = ASPx.Formatter.Format(formatString, itemValues);
4365 var filterStartIndex = ASPx.Str.PrepareStringForFilter(formatedString).indexOf(ASPx.Str.PrepareStringForFilter(filterString));
4366 if(filterStartIndex == -1) return result;
4367 var filterEndIndex = filterStartIndex + filterString.length;
4368 var templates = FormatStringHelper.GetPlaceHolderTemplates(formatString);
4369 this.SupplyTemplatesWithRealValues(itemValues, templates);
4370 for(var i = 0; i < templates.length ; i++) {
4371  if(this.IsFilterCrossPlaseHolder(filterStartIndex, filterEndIndex, templates[i])) 
4372   result.push(this.GetColumnSelectionsForItemValue(templates[i], filterStartIndex, filterEndIndex));
4373 }
4374 return result;
4375}
4376ContainsFilteringUtils.GetColumnSelectionsForItemValue = function(template, filterStartIndex, filterEndIndex) {
4377 var selectedTextStartIndex = filterStartIndex < template.realStartIndex ? 0 :
4378  filterStartIndex - template.realStartIndex;
4379 var selectedTextEndIndex = filterEndIndex >  template.realStartIndex + template.realLength ? template.realLength :
4380  filterEndIndex - template.realStartIndex;
4381 var selectedTextLength = selectedTextEndIndex - selectedTextStartIndex;
4382  return new this.ColumnSelectionStruct(template.index, selectedTextStartIndex, selectedTextLength);
4383},
4384ContainsFilteringUtils.GetSelectionForSingleColumnItem = function(itemValues, filterString) {
4385 var selectedTextStartIndex = ASPx.Str.PrepareStringForFilter(itemValues[0]).indexOf(ASPx.Str.PrepareStringForFilter(filterString));
4386 var selectedTextLength = filterString.length;
4387 return [new this.ColumnSelectionStruct(0, selectedTextStartIndex, selectedTextLength)];
4388}
4389ContainsFilteringUtils.ResetFormatStringIndex = function(formatString, index) {
4390 if(index != 0)
4391  return formatString.replace(index.toString(), "0");
4392 return formatString;
4393},
4394ContainsFilteringUtils.SupplyTemplatesWithRealValues = function(itemValues, templates) {
4395 var shift = 0;
4396 for(var i = 0; i < templates.length; i++) {
4397  var formatString = this.ResetFormatStringIndex(templates[i].placeHolderString, templates[i].index);
4398  var currentItemValue = itemValues[templates[i].index];
4399  templates[i].realLength = ASPx.Formatter.Format(formatString, currentItemValue).length;
4400  templates[i].realStartIndex  += templates[i].startIndex + shift; 
4401  shift += templates[i].realLength - templates[i].placeHolderString.length; 
4402 }
4403}
4404ContainsFilteringUtils.PrepareElementText = function(itemText) {
4405 return itemText ? itemText.replace(/\&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;") : '';
4406}
4407ContainsFilteringUtils.UnselectContainsTextInElement = function(element, selection, highlightTagName) {
4408 var currentText =  ASPx.Attr.GetAttribute (element, "DXText");
4409 if(ASPx.IsExists(currentText)) {
4410  currentText = ContainsFilteringUtils.PrepareElementText(currentText);
4411  ASPx.SetInnerHtml(element, currentText === "" ? "&nbsp;" : currentText);
4412 }
4413}
4414ContainsFilteringUtils.ReselectContainsTextInElement = function(element, selection, highlightTagName) {
4415 var currentText = ASPx.GetInnerText(element);
4416 if(!highlightTagName)
4417  highlightTagName = "em";
4418 highlightTagName = highlightTagName.toLowerCase();
4419 if(currentText.indexOf("</" + highlightTagName + ">") != -1)
4420  ContainsFilteringUtils.UnselectContainsTextInElement(element, selection, highlightTagName);
4421 return ContainsFilteringUtils.SelectContainsTextInElement(element, selection, highlightTagName);
4422}
4423ContainsFilteringUtils.SelectContainsTextInElement = function(element, selection, highlightTagName) {
4424 if(selection.startIndex == -1)
4425  return;
4426 var currentText =  ASPx.Attr.GetAttribute (element, "DXText");
4427 if(!ASPx.IsExists(currentText)) ASPx.Attr.SetAttribute (element, "DXText", ASPx.GetInnerText(element));
4428 if(!highlightTagName)
4429  highlightTagName = "em";
4430 highlightTagName = highlightTagName.toLowerCase();
4431 var oldInnerText = ASPx.GetInnerText(element);
4432 var newInnerText = ContainsFilteringUtils.PrepareElementText(oldInnerText.substr(0, selection.startIndex)) + "<" + highlightTagName + ">" +
4433      oldInnerText.substr(selection.startIndex, selection.length) + "</" + highlightTagName + ">" +
4434      ContainsFilteringUtils.PrepareElementText(oldInnerText.substr(selection.startIndex + selection.length));
4435 ASPx.SetInnerHtml(element, newInnerText);
4436}
4437ASPx.ContainsFilteringUtils = ContainsFilteringUtils;
4438ASPx.MakeEqualControlsWidth = function(name1, name2){
4439 var control1 = ASPx.GetControlCollection().Get(name1);
4440 var control2 = ASPx.GetControlCollection().Get(name2);
4441 if(control1 && control2){
4442  var width = Math.max(control1.GetWidth(), control2.GetWidth());
4443  control1.SetWidth(width);
4444  control2.SetWidth(width);
4445 }
4446}
4447var AccessibilityUtils = {
4448 isInitialized: false,
4449 highContrastCssClassMarker: "dxHighContrast",
4450 highContrastThemeActive: false,
4451 accessibleBackgroundCssMarker: ".dx-runtime-background",
4452 createAccessibleBackgrounds: function(control) {
4453  if(!this.highContrastThemeActive || control.accessibleBackgroundsCreated || !control.accessibilityCompliant)
4454   return;
4455  var className = this.accessibleBackgroundCssMarker;
4456  var styleSheetRuleNames = [];
4457  iterateStyleSheetRules(null, function(rule) {
4458   var selectorTxt = rule.selectorText;
4459   if(selectorTxt && selectorTxt.indexOf(className) > -1)
4460    styleSheetRuleNames.push(ASPx.Str.CompleteReplace(selectorTxt, className, "")); 
4461  });
4462  for(var i = 0; i < styleSheetRuleNames.length; i++) {
4463   var name = styleSheetRuleNames[i];
4464   var rule = ASPx.GetStyleSheetRules(name.substring(1));
4465   if(rule && rule.style && rule.style.backgroundImage)
4466    this.createAccessibleBackground(control.GetMainElement(), rule.style, name);
4467  }
4468  control.accessibleBackgroundsCreated = true;
4469 },
4470 createAccessibleBackground: function(container, style, selector) {
4471  if(!container)
4472   return;
4473  var backgroundUrl = style.backgroundImage.substring(5, style.backgroundImage.length - 2);
4474  var elements = container.querySelectorAll(selector);
4475  var accessibleBackgroundClassName = "dx-acc-bi";
4476  for(var i = 0; i < elements.length; i++) {
4477   var element = elements[i];
4478   if(ASPx.ElementHasCssClass(element, accessibleBackgroundClassName))
4479    continue;
4480   var image = null;
4481   if(element.tagName !== "IMG") {
4482    ASPx.AddClassNameToElement(element, accessibleBackgroundClassName);
4483    image = element.ownerDocument.createElement("IMG");
4484    ASPx.SetStyles(image, { width: element.offsetWidth, height: element.offsetHeight });
4485    if(element.firstChild)
4486     element.insertBefore(image, element.firstChild);
4487    else
4488     element.appendChild(image);
4489   } else
4490    image = element;
4491   image.src = backgroundUrl;
4492  }
4493 },
4494 initialize: function() {
4495  if(!this.isInitialized) {
4496   this.isInitialized = true;
4497   this.detectHighContrastTheme();
4498  }   
4499 },
4500 detectHighContrastTheme: function() {
4501  var testElement = document.createElement("DIV");
4502  ASPx.SetStyles(testElement, {
4503   backgroundImage: "url('" + ASPx.EmptyImageUrl + "')",
4504   display: "none"
4505  }, true);
4506  var docElement = document.documentElement;
4507  docElement.appendChild(testElement);
4508  var actualBackgroundImg = ASPx.GetCurrentStyle(testElement).backgroundImage;
4509  docElement.removeChild(testElement);
4510  if(actualBackgroundImg === "none") {
4511   this.highContrastThemeActive = true;
4512   ASPx.AddClassNameToElement(docElement, this.highContrastCssClassMarker);
4513  }
4514 }
4515};
4516ASPx.AccessibilityUtils = AccessibilityUtils;
4517ASPx.AccessibilityUtils.SendMessageToAssistiveTechnology = function(message) {
4518 var messageParts = ASPx.Ident.IsArray(message) ? message : [message];
4519 var args = new ASPxClientControlBeforePronounceEventArgs(messageParts, null);
4520 ASPx.AccessibilityPronouncer.EnsureInitialize();
4521 ASPx.AccessibilityPronouncer.Pronounce(args, ASPx.AccessibilityPronouncerType.live);
4522};
4523ASPx.AccessibilityUtils.SetFocusAccessible = function(focusableElement) {
4524 if(!focusableElement)
4525  return;
4526 var elementId = focusableElement.id;
4527 if(!elementId) {
4528  var namedParent = ASPx.GetParent(focusableElement, function(element) {
4529   return !!element.id;
4530  });
4531  if(ASPx.IsExists(namedParent))
4532   elementId = namedParent.id;
4533 }
4534 var focusableControl = ASPx.GetClientControlByElementID(elementId);
4535 if(focusableControl && focusableControl.OnAssociatedLabelClick)
4536  focusableControl.OnAssociatedLabelClick(focusableElement);
4537 else
4538  window.setTimeout(function() {
4539   ASPx.AccessibilityUtils.SetFocusAccessibleCore(focusableElement);
4540  }, 0);
4541}
4542ASPx.AccessibilityUtils.SetFocusAccessibleCore = function(focusableElement) {
4543 if(!ASPx.IsExists(focusableElement))
4544  return;
4545 if(!ASPx.IsValidElement(focusableElement) && focusableElement.id)
4546  focusableElement = ASPx.GetElementById(focusableElement.id);
4547 if(!ASPx.IsActionElement(focusableElement))
4548  focusableElement = ASPx.RestoreFocusHelper.findNeighbourFocusElement(focusableElement, document.body);
4549 if(ASPx.IsExistsElement(focusableElement))
4550  focusableElement.focus();
4551}
4552ASPx.EnableCssAnimation = true;
4553var AnimationTransitionBase = ASPx.CreateClass(null, {
4554 constructor: function(element, options) {
4555  if(element) {
4556   AnimationTransitionBase.Cancel(element);
4557   this.element = element;
4558   this.element.aspxTransition = this;
4559  }
4560  this.duration = options.duration || AnimationConstants.Durations.DEFAULT;
4561  this.transition = options.transition || AnimationConstants.Transitions.SINE;
4562  this.property = options.property;
4563  this.unit = options.unit || "";
4564  this.onComplete = options.onComplete;
4565  this.to = null;
4566  this.from = null;
4567 },
4568 Start: function(from, to) {
4569  if(to != undefined) {
4570   this.to = to;
4571   this.from = from;
4572   this.SetValue(this.from);
4573  }
4574  else
4575   this.to = from;
4576 },
4577 Cancel: function() {
4578  if(!this.element)
4579   return;
4580  try {
4581   delete this.element.aspxTransition;
4582  } catch(e) {
4583   this.element.aspxTransition = undefined;
4584  }
4585 },
4586 GetValue: function() {
4587  return this.getValueInternal(this.element, this.property);
4588 },
4589 SetValue: function(value) {
4590  this.setValueInternal(this.element, this.property, this.unit, value);
4591 },
4592 setValueInternal: function(element, property, unit, value) {
4593  if(property == "opacity")
4594   AnimationUtils.setOpacity(element, value);
4595  else
4596   element.style[property] = value + unit;
4597 },
4598 getValueInternal: function(element, property) {
4599  if(property == "opacity")
4600   return ASPx.GetElementOpacity(element);
4601  var value = parseFloat(element.style[property]);
4602  return isNaN(value) ? 0 : value;
4603 },
4604 performOnComplete: function() {
4605  if(this.onComplete)
4606   this.onComplete(this.element);
4607 },
4608 getTransition: function() {
4609  return this.transition;
4610 }
4611});
4612AnimationTransitionBase.Cancel = function(element) {
4613 if(element.aspxTransition)
4614  element.aspxTransition.Cancel();
4615};
4616var AnimationConstants = {};
4617AnimationConstants.Durations = {
4618 SHORT: 200,
4619 DEFAULT: 400,
4620 LONG: 600
4621};
4622AnimationConstants.Transitions = {
4623 LINER: {
4624  Css: "cubic-bezier(0.250, 0.250, 0.750, 0.750)",
4625  Js: function(progress) { return progress; }
4626 },
4627 SINE: {
4628  Css: "cubic-bezier(0.470, 0.000, 0.745, 0.715)",
4629  Js: function(progress) { return Math.sin(progress * 1.57); }
4630 },
4631 POW: {
4632  Css: "cubic-bezier(0.755, 0.050, 0.855, 0.060)",
4633  Js: function(progress) { return Math.pow(progress, 4); }
4634 },
4635 POW_EASE_OUT: {
4636  Css: "cubic-bezier(0.165, 0.840, 0.440, 1.000)",
4637  Js: function(progress) { return 1 - AnimationConstants.Transitions.POW.Js(1 - progress); }
4638 },
4639 RIPPLE: {
4640  Css: "cubic-bezier(0.47, 0.06, 0.23, 0.99)",
4641  Js: function(progress) {
4642   return Math.pow((progress), 3) * 0.47 + 3 * progress * Math.pow((1 - progress), 2) * 0.06 + 3 * Math.pow(progress, 2) *
4643    (1 - progress) * 0.23 + 0.99 * Math.pow(progress, 3);
4644  }
4645 }
4646};
4647var JsAnimationTransition = ASPx.CreateClass(AnimationTransitionBase, {
4648 constructor: function(element, options) {
4649  this.constructor.prototype.constructor.call(this, element, options);
4650  this.onStep = options.onStep;
4651  this.fps = 60;
4652  this.startTime = null;
4653 },
4654 Start: function(from, to) {
4655  if(from == to) {
4656   this.from = this.to = from;
4657   setTimeout(this.complete.aspxBind(this), 0);
4658  }
4659  else {
4660   AnimationTransitionBase.prototype.Start.call(this, from, to);
4661   if(to == undefined)
4662    this.from = this.GetValue();
4663   this.initTimer();
4664  }
4665 },
4666 Cancel: function() {
4667  AnimationTransitionBase.prototype.Cancel.call(this);
4668  if(this.timerId)
4669   clearInterval(this.timerId);
4670 },
4671 initTimer: function() {
4672  this.startTime = new Date();
4673  this.timerId = window.setInterval(function() { this.onTick(); }.aspxBind(this), 1000 / this.fps);
4674 },
4675 onTick: function() {
4676  var progress = (new Date() - this.startTime) / this.duration;
4677  if(progress >= 1)
4678   this.complete();
4679  else {
4680   this.update(progress);
4681   if(this.onStep)
4682    this.onStep();
4683  }
4684 },
4685 update: function(progress) {
4686  this.SetValue(this.gatCalculatedValue(this.from, this.to, progress));
4687 },
4688 complete: function() {
4689  this.Cancel();
4690  this.update(1);
4691  this.performOnComplete();
4692 },
4693 gatCalculatedValue: function(from, to, progress) {
4694  if(progress == 1)
4695   return to;
4696  return from + (to - from) * this.getTransition()(progress);
4697 },
4698 getTransition: function() {
4699  return this.transition.Js;
4700 }
4701});
4702var SimpleAnimationTransition = ASPx.CreateClass(JsAnimationTransition, {
4703 constructor: function(options) {
4704  this.constructor.prototype.constructor.call(this, null, options);
4705  this.transition = options.transition || AnimationConstants.Transitions.POW_EASE_OUT;
4706  this.onUpdate = options.onUpdate;
4707  this.lastValue = 0;
4708 },
4709 SetValue: function(value) {
4710  this.onUpdate(value - this.lastValue);
4711  this.lastValue = value;
4712 },
4713 GetValue: function() {
4714  return this.lastValue;
4715 },
4716 performOnComplete: function() {
4717  if(this.onComplete)
4718   this.onComplete();
4719 }
4720});
4721var MultipleJsAnimationTransition = ASPx.CreateClass(JsAnimationTransition, {
4722 constructor: function(element, options) {
4723  this.constructor.prototype.constructor.call(this, element, options);
4724  this.properties = {};
4725 },
4726 Start: function(properties) {
4727  this.initProperties(properties);
4728  this.initTimer();
4729 },
4730 initProperties: function(properties) {
4731  this.properties = properties;
4732  for(var propName in this.properties)
4733   if(properties[propName].from == undefined)
4734    properties[propName].from = this.getValueInternal(this.element, propName);
4735 },
4736 update: function(progress) {
4737  for(var propName in this.properties) {
4738   var property = this.properties[propName];
4739   if(property.from != property.to)
4740    this.setValueInternal(this.element, propName, property.unit, this.gatCalculatedValue(property.from, property.to, progress));
4741  }
4742 }
4743});
4744var CssAnimationTransition = ASPx.CreateClass(AnimationTransitionBase, {
4745 constructor: function(element, options) {
4746  this.constructor.prototype.constructor.call(this, element, options);
4747  this.transitionPropertyName = AnimationUtils.CurrentTransition.property;
4748  this.eventName = AnimationUtils.CurrentTransition.event;
4749 },
4750 Start: function(from, to) {
4751  AnimationTransitionBase.prototype.Start.call(this, from, to);
4752  this.startTimerId = window.setTimeout(function() {
4753   if(this.from == this.to)
4754    this.onTransitionEnd();
4755   else {
4756    var isHidden = this.element.offsetHeight == 0 && this.element.offsetWidth == 0; 
4757    if(!isHidden)
4758     this.prepareElementBeforeAnimation();
4759    this.SetValue(this.to);
4760    if(isHidden)
4761     this.onTransitionEnd();
4762   }
4763  }.aspxBind(this), 0);
4764 },
4765 Cancel: function() {
4766  window.clearTimeout(this.startTimerId);
4767  AnimationTransitionBase.prototype.Cancel.call(this);
4768  ASPx.Evt.DetachEventFromElement(this.element, this.eventName, CssAnimationTransition.transitionEnd);
4769  this.stopAnimation();
4770  this.setValueInternal(this.element, this.transitionPropertyName, "", "");
4771 },
4772 prepareElementBeforeAnimation: function() {
4773  ASPx.Evt.AttachEventToElement(this.element, this.eventName, CssAnimationTransition.transitionEnd);
4774  var tmpH = this.element.offsetHeight; 
4775  this.element.style[this.transitionPropertyName] = this.getTransitionCssString();
4776  if(ASPx.Browser.Safari && ASPx.Browser.MacOSMobilePlatform && ASPx.Browser.MajorVersion >= 8) 
4777   setTimeout(function() {
4778    if(this.element && this.element.aspxTransition) {
4779     this.element.style[this.transitionPropertyName] = "";
4780     this.element.aspxTransition.onTransitionEnd();
4781    }
4782   }.aspxBind(this), this.duration + 100);
4783 },
4784 stopAnimation: function() {
4785  this.SetValue(ASPx.GetCurrentStyle(this.element)[this.property]);
4786 },
4787 onTransitionEnd: function() {
4788  this.Cancel();
4789  this.performOnComplete();
4790 },
4791 getTransition: function() {
4792  return this.transition.Css;
4793 },
4794 getTransitionCssString: function() {
4795  return this.getTransitionCssStringInternal(this.getCssName(this.property));
4796 },
4797 getTransitionCssStringInternal: function(cssProperty) {
4798  return cssProperty + " " + this.duration + "ms " + this.getTransition();
4799 },
4800 getCssName: function(property) {
4801  switch(property) {
4802   case "marginLeft":
4803    return "margin-left";
4804   case "marginTop":
4805    return "margin-top"
4806  }
4807  return property;
4808 }
4809});
4810var MultipleCssAnimationTransition = ASPx.CreateClass(CssAnimationTransition, {
4811 constructor: function(element, options) {
4812  this.constructor.prototype.constructor.call(this, element, options);
4813  this.properties = null;
4814 },
4815 Start: function(properties) {
4816  this.properties = properties;
4817  this.forEachProperties(function(property, propName) {
4818   if(property.from !== undefined)
4819    this.setValueInternal(this.element, propName, property.unit, property.from);
4820  }.aspxBind(this));
4821  this.prepareElementBeforeAnimation();
4822  window.setTimeout(function() {
4823   this.forEachProperties(function(property, propName) {
4824    this.setValueInternal(this.element, propName, property.unit, property.to);
4825   }.aspxBind(this));
4826  }.aspxBind(this), 0);
4827 },
4828 stopAnimation: function() {
4829  var style = ASPx.GetCurrentStyle(this.element);
4830  this.forEachProperties(function(property, propName) {
4831   this.setValueInternal(this.element, propName, "", style[propName]);
4832  }.aspxBind(this));
4833 },
4834 getTransitionCssString: function() {
4835  var str = "";
4836  this.forEachProperties(function(property, propName) {
4837   str += this.getTransitionCssStringInternal(this.getCssName(propName)) + ",";
4838  }.aspxBind(this));
4839  str = str.substring(0, str.length - 1);
4840  return str;
4841 },
4842 forEachProperties: function(func) {
4843  for(var propName in this.properties) {
4844   var property = this.properties[propName];
4845   if(property.from == undefined)
4846    property.from = this.getValueInternal(this.element, propName);
4847   if(property.from != property.to)
4848    func(property, propName);
4849  }
4850 }
4851});
4852CssAnimationTransition.transitionEnd = function(evt) {
4853 var element = evt.target;
4854 if(element && element.aspxTransition)
4855  element.aspxTransition.onTransitionEnd();
4856}
4857var AnimationUtils = {
4858 CanUseCssTransition: function() { return ASPx.EnableCssAnimation && this.CurrentTransition },
4859 CanUseCssTransform: function() { return this.CanUseCssTransition() && this.CurrentTransform },
4860 CurrentTransition: (function() {
4861  if(ASPx.Browser.IE) 
4862   return null;
4863  var transitions = [
4864   { property: "webkitTransition", event: "webkitTransitionEnd" },
4865   { property: "MozTransition", event: "transitionend" },
4866   { property: "OTransition", event: "oTransitionEnd" },
4867   { property: "transition", event: "transitionend" }
4868  ]
4869  var fakeElement = document.createElement("DIV");
4870  for(var i = 0; i < transitions.length; i++)
4871   if(transitions[i].property in fakeElement.style)
4872    return transitions[i];
4873 })(),
4874 CurrentTransform: (function() {
4875  var transforms = ["transform", "MozTransform", "-webkit-transform", "msTransform", "OTransform"];
4876  var fakeElement = document.createElement("DIV");
4877  for(var i = 0; i < transforms.length; i++)
4878   if(transforms[i] in fakeElement.style)
4879    return transforms[i];
4880 })(),
4881 SetTransformValue: function(element, position, isTop) {
4882  if(this.CanUseCssTransform())
4883   element.style[this.CurrentTransform] = this.GetTransformCssText(position, isTop);
4884  else
4885   element.style[!isTop ? "left" : "top"] = position + "px";
4886 },
4887 GetTransformValue: function(element, isTop) {
4888  if(this.CanUseCssTransform()) {
4889   var cssValue = element.style[this.CurrentTransform];
4890   return cssValue ? Number(cssValue.replace('matrix(1, 0, 0, 1,', '').replace(')', '').split(',')[!isTop ? 0 : 1]) : 0;
4891  }
4892  else
4893   return !isTop ? element.offsetLeft : element.offsetTop;
4894 },
4895 GetTransformCssText: function(position, isTop) {
4896  return "matrix(1, 0, 0, 1," + (!isTop ? position : 0) + ", " + (!isTop ? 0 : position) + ")";
4897 },
4898 createMultipleAnimationTransition: function (element, options) {
4899  return this.CanUseCssTransition() && !options.onStep ? new MultipleCssAnimationTransition(element, options) : new MultipleJsAnimationTransition(element, options);
4900 },
4901 createSimpleAnimationTransition: function(options) {
4902  return new SimpleAnimationTransition(options);
4903 },
4904 createJsAnimationTransition: function(element, options) {
4905  return new JsAnimationTransition(element, options);
4906 },
4907 createCssAnimationTransition: function(element, options) {
4908  return new CssAnimationTransition(element, options);
4909 },
4910 setOpacity: function(element, value) {
4911  ASPx.SetElementOpacity(element, value);
4912 }
4913};
4914ASPxClientUtils = {};
4915ASPxClientUtils.agent = Browser.UserAgent;
4916ASPxClientUtils.opera = Browser.Opera;
4917ASPxClientUtils.opera9 = Browser.Opera && Browser.MajorVersion == 9;
4918ASPxClientUtils.safari = Browser.Safari;
4919ASPxClientUtils.safari3 = Browser.Safari && Browser.MajorVersion == 3;
4920ASPxClientUtils.safariMacOS = Browser.Safari && Browser.MacOSPlatform;
4921ASPxClientUtils.chrome = Browser.Chrome;
4922ASPxClientUtils.ie = Browser.IE;
4923;
4924ASPxClientUtils.ie7 = Browser.IE && Browser.MajorVersion == 7;
4925ASPxClientUtils.firefox = Browser.Firefox;
4926ASPxClientUtils.firefox3 = Browser.Firefox && Browser.MajorVersion == 3;
4927ASPxClientUtils.mozilla = Browser.Mozilla;
4928ASPxClientUtils.netscape = Browser.Netscape;
4929ASPxClientUtils.browserVersion = Browser.Version;
4930ASPxClientUtils.browserMajorVersion = Browser.MajorVersion;
4931ASPxClientUtils.macOSPlatform = Browser.MacOSPlatform;
4932ASPxClientUtils.windowsPlatform = Browser.WindowsPlatform;
4933ASPxClientUtils.webKitFamily = Browser.WebKitFamily;
4934ASPxClientUtils.netscapeFamily = Browser.NetscapeFamily;
4935ASPxClientUtils.touchUI = Browser.TouchUI;
4936ASPxClientUtils.webKitTouchUI = Browser.WebKitTouchUI;
4937ASPxClientUtils.msTouchUI = Browser.MSTouchUI;
4938ASPxClientUtils.iOSPlatform = Browser.MacOSMobilePlatform;
4939ASPxClientUtils.androidPlatform = Browser.AndroidMobilePlatform;
4940ASPxClientUtils.ArrayInsert = Data.ArrayInsert;
4941ASPxClientUtils.ArrayRemove = Data.ArrayRemove;
4942ASPxClientUtils.ArrayRemoveAt = Data.ArrayRemoveAt;
4943ASPxClientUtils.ArrayClear = Data.ArrayClear;
4944ASPxClientUtils.ArrayIndexOf = Data.ArrayIndexOf;
4945ASPxClientUtils.AttachEventToElement = Evt.AttachEventToElement;
4946ASPxClientUtils.DetachEventFromElement = Evt.DetachEventFromElement;
4947ASPxClientUtils.GetEventSource = Evt.GetEventSource;
4948ASPxClientUtils.GetEventX = Evt.GetEventX;
4949ASPxClientUtils.GetEventY = Evt.GetEventY;
4950ASPxClientUtils.GetKeyCode = Evt.GetKeyCode;
4951ASPxClientUtils.PreventEvent = Evt.PreventEvent;
4952ASPxClientUtils.PreventEventAndBubble = Evt.PreventEventAndBubble;
4953ASPxClientUtils.PreventDragStart = Evt.PreventDragStart;
4954ASPxClientUtils.ClearSelection = Selection.Clear;
4955ASPxClientUtils.IsExists = ASPx.IsExists;
4956ASPxClientUtils.IsFunction = ASPx.IsFunction;
4957ASPxClientUtils.GetAbsoluteX = ASPx.GetAbsoluteX;
4958ASPxClientUtils.GetAbsoluteY = ASPx.GetAbsoluteY;
4959ASPxClientUtils.SetAbsoluteX = ASPx.SetAbsoluteX;
4960ASPxClientUtils.SetAbsoluteY = ASPx.SetAbsoluteY;
4961ASPxClientUtils.GetDocumentScrollTop = ASPx.GetDocumentScrollTop;
4962ASPxClientUtils.GetDocumentScrollLeft = ASPx.GetDocumentScrollLeft;
4963ASPxClientUtils.GetDocumentClientWidth = ASPx.GetDocumentClientWidth;
4964ASPxClientUtils.GetDocumentClientHeight = ASPx.GetDocumentClientHeight;
4965ASPxClientUtils.GetIsParent = ASPx.GetIsParent;
4966ASPxClientUtils.GetParentById = ASPx.GetParentById;
4967ASPxClientUtils.GetParentByTagName = ASPx.GetParentByTagName;
4968ASPxClientUtils.GetParentByClassName = ASPx.GetParentByPartialClassName;
4969ASPxClientUtils.GetChildById = ASPx.GetChildById;
4970ASPxClientUtils.GetChildByTagName = ASPx.GetChildByTagName;
4971ASPxClientUtils.SetCookie = Cookie.SetCookie;
4972ASPxClientUtils.GetCookie = Cookie.GetCookie;
4973ASPxClientUtils.DeleteCookie = Cookie.DelCookie;
4974ASPxClientUtils.GetShortcutCode = ASPx.GetShortcutCode; 
4975ASPxClientUtils.GetShortcutCodeByEvent = ASPx.GetShortcutCodeByEvent;
4976ASPxClientUtils.StringToShortcutCode = ASPx.ParseShortcutString;
4977ASPxClientUtils.Trim = Str.Trim; 
4978ASPxClientUtils.TrimStart = Str.TrimStart;
4979ASPxClientUtils.TrimEnd = Str.TrimEnd;
4980ASPxClientUtils.SendMessageToAssistiveTechnology = ASPx.AccessibilityUtils.SendMessageToAssistiveTechnology;
4981window.ASPxClientUtils = ASPxClientUtils;
4982ASPx.AnimationUtils = AnimationUtils;
4983ASPx.AnimationTransitionBase = AnimationTransitionBase;
4984ASPx.AnimationConstants = AnimationConstants;
4985})();
4986   
4987(function () {
4988ASPx.classesScriptParsed = false;
4989ASPx.documentLoaded = false; 
4990ASPx.CallbackType = {
4991 Data: "d",
4992 Common: "c"
4993};
4994ASPx.callbackState = {
4995 aborted: "aborted",
4996 inTurn: "inTurn",
4997 sent: "sent"
4998};
4999var ASPxClientEvent = ASPx.CreateClass(null, {
5000 constructor: function() {
5001  this.handlerInfoList = [];
5002  this.firingIndex = -1;
5003 },
5004 AddHandler: function(handler, executionContext) {
5005  if(typeof(executionContext) == "undefined")
5006   executionContext = null;
5007  this.RemoveHandler(handler, executionContext);
5008  var handlerInfo = ASPxClientEvent.CreateHandlerInfo(handler, executionContext);
5009  this.handlerInfoList.push(handlerInfo);
5010 },
5011 RemoveHandler: function(handler, executionContext) {
5012  this.removeHandlerByCondition(function(handlerInfo) {
5013   return handlerInfo.handler == handler && 
5014    (!executionContext || handlerInfo.executionContext == executionContext);
5015  });
5016 },
5017 removeHandlerByCondition: function(predicate) {
5018   for(var i = this.handlerInfoList.length - 1; i >= 0; i--) {
5019   var handlerInfo = this.handlerInfoList[i];
5020   if(predicate(handlerInfo)) {
5021    ASPx.Data.ArrayRemoveAt(this.handlerInfoList, i);
5022    if(i <= this.firingIndex)
5023     this.firingIndex--;
5024   }
5025  }
5026 },
5027 removeHandlerByControlName: function(controlName) {
5028  this.removeHandlerByCondition(function(handlerInfo) {
5029   return handlerInfo.executionContext &&  
5030    handlerInfo.executionContext.name === controlName;
5031  });
5032 },
5033 ClearHandlers: function() {
5034  this.handlerInfoList.length = 0;
5035 },
5036 FireEvent: function(obj, args) {
5037  for(this.firingIndex = 0; this.firingIndex < this.handlerInfoList.length; this.firingIndex++) {
5038   var handlerInfo = this.handlerInfoList[this.firingIndex];
5039   handlerInfo.handler.call(handlerInfo.executionContext, obj, args);
5040  }
5041 },
5042 InsertFirstHandler: function(handler, executionContext){
5043  if(typeof(executionContext) == "undefined")
5044   executionContext = null;
5045  var handlerInfo = ASPxClientEvent.CreateHandlerInfo(handler, executionContext);
5046  ASPx.Data.ArrayInsert(this.handlerInfoList, handlerInfo, 0);
5047 },
5048 IsEmpty: function() {
5049  return this.handlerInfoList.length == 0;
5050 }
5051});
5052ASPxClientEvent.CreateHandlerInfo = function(handler, executionContext) {
5053 return {
5054  handler: handler,
5055  executionContext: executionContext
5056 };
5057};
5058var ASPxClientEventArgs = ASPx.CreateClass(null, {
5059 constructor: function() {
5060 }
5061});
5062ASPxClientEventArgs.Empty = new ASPxClientEventArgs();
5063var ASPxClientCancelEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
5064 constructor: function(){
5065  this.constructor.prototype.constructor.call(this);
5066  this.cancel = false;
5067 }
5068});
5069var ASPxClientProcessingModeEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
5070 constructor: function(processOnServer){
5071  this.constructor.prototype.constructor.call(this);
5072  this.processOnServer = processOnServer;
5073 }
5074});
5075var ASPxClientProcessingModeCancelEventArgs = ASPx.CreateClass(ASPxClientProcessingModeEventArgs, {
5076 constructor: function(processOnServer){
5077  this.constructor.prototype.constructor.call(this, processOnServer);
5078  this.cancel = false;
5079 }
5080});
5081var OrderedMap = ASPx.CreateClass(null, {
5082 constructor: function(){
5083  this.entries = {};
5084  this.firstEntry = null;
5085  this.lastEntry = null;
5086 },
5087 add: function(key, element) {
5088  var entry = this.addEntry(key, element);
5089  this.entries[key] = entry;
5090 },
5091 remove: function(key) {
5092  var entry = this.entries[key];
5093  if(entry === undefined)
5094   return;
5095  this.removeEntry(entry);
5096  delete this.entries[key];
5097 },
5098 clear: function() {
5099  this.markAllEntriesAsRemoved();
5100  this.entries = {};
5101  this.firstEntry = null;
5102  this.lastEntry = null;
5103 },
5104 get: function(key) {
5105  var entry = this.entries[key];
5106  return entry ? entry.value : undefined;
5107 },
5108 forEachEntry: function(processFunc, context) {
5109  context = context || this;
5110  for(var entry = this.firstEntry; entry; entry = entry.next) {
5111   if(entry.removed)
5112    continue;
5113   if(processFunc.call(context, entry.key, entry.value))
5114    return;
5115  }
5116 },
5117 addEntry: function(key, element) {
5118  var entry = { key: key, value: element, next: null, prev: null };
5119  if(!this.firstEntry)
5120   this.firstEntry = entry;
5121  else {
5122   entry.prev = this.lastEntry;
5123   this.lastEntry.next = entry;
5124  }
5125  this.lastEntry = entry;
5126  return entry;
5127 },
5128 removeEntry: function(entry) {
5129  if(this.firstEntry == entry)
5130   this.firstEntry = entry.next;
5131  if(this.lastEntry == entry)
5132   this.lastEntry = entry.prev;
5133  if(entry.prev)
5134   entry.prev.next = entry.next;
5135  if(entry.next)
5136   entry.next.prev = entry.prev;
5137  entry.removed = true;
5138 },
5139 markAllEntriesAsRemoved: function() {
5140  for(var entry = this.firstEntry; entry; entry = entry.next)
5141   entry.removed = true;
5142 }
5143});
5144var CollectionBase = ASPx.CreateClass(null, {
5145 constructor: function(){
5146  this.elementsMap = new OrderedMap();
5147  this.isASPxClientCollection = true;
5148 },
5149 Add: function(key, element) {
5150  this.elementsMap.add(key, element);
5151 },
5152 Remove: function(key) {
5153  this.elementsMap.remove(key);
5154 },
5155 Clear: function(){
5156  this.elementsMap.clear();
5157 },
5158 Get: function(key){
5159  return this.elementsMap.get(key);
5160 }
5161});
5162var GarbageCollector = ASPx.CreateClass(null, {
5163 constructor: function() {
5164  this.interval = 5000;
5165  this.intervalID = window.setInterval(function(){ this.CollectObjects(); }.aspxBind(this), this.interval);
5166 },
5167 CollectObjects: function(){
5168  if(ASPx.GetControlCollection().InCallback()) return;
5169  ASPx.GetControlCollectionCollection().RemoveDisposedControls();
5170  if(typeof(ASPx.GetStateController) != "undefined")
5171   ASPx.GetStateController().RemoveDisposedItems();
5172  if(ASPx.TableScrollHelperCollection)
5173   ASPx.TableScrollHelperCollection.RemoveDisposedObjects();
5174  if(ASPx.Ident.scripts.ASPxClientRatingControl)
5175   ASPxClientRatingControl.RemoveDisposedElementUnderCursor();
5176  var postHandler = aspxGetPostHandler();
5177  if(postHandler)
5178   postHandler.RemoveDisposedFormsFromCache();
5179 }
5180});
5181var gcCollector = new GarbageCollector(); 
5182var ControlTree = ASPx.CreateClass(null, {
5183 constructor: function(controlCollection, container) {
5184  this.container = container;
5185  this.domMap = { };
5186  this.rootNode = this.createNode(null, null);
5187  this.createControlTree(controlCollection, container);
5188 },
5189 forEachControl: function(collapseControls, processFunc) {
5190  var observer = _aspxGetDomObserver();
5191  observer.pause(this.container, true);
5192  var documentScrollInfo;
5193  if(collapseControls) {
5194   documentScrollInfo = ASPx.GetOuterScrollPosition(document.body);
5195   this.collapseControls(this.rootNode);
5196  }
5197  var adjustNodes = [], 
5198   autoHeightNodes = [];
5199  var requireReAdjust = this.forEachControlCore(this.rootNode, collapseControls, processFunc, adju
5199stNodes, autoHeightNodes);
5200  if(requireReAdjust)
5201   this.forEachControlsBackward(adjustNodes, collapseControls, processFunc);
5202  else {
5203   for(var i = 0, node; node = autoHeightNodes[i]; i++)
5204    node.control.AdjustAutoHeight();
5205  }
5206  if(collapseControls)
5207   ASPx.RestoreOuterScrollPosition(documentScrollInfo);
5208  observer.resume(this.container, true);
5209 },
5210 forEachControlCore: function(node, collapseControls, processFunc, adjustNodes, autoHeightNodes) {
5211  var requireReAdjust = false,
5212   size, newSize;
5213  if(node.control) {
5214   var checkReadjustment = collapseControls && node.control.IsControlCollapsed() && node.control.CanCauseReadjustment();
5215   if(checkReadjustment)
5216    size = node.control.GetControlPercentMarkerSize(false, true);
5217   if(node.control.IsControlCollapsed() && !node.control.IsExpandableByAdjustment())
5218    node.control.ExpandControl();
5219   node.control.isInsideHierarchyAdjustment = true;
5220   processFunc(node.control);
5221   node.control.isInsideHierarchyAdjustment = false;
5222   if(checkReadjustment) {
5223    newSize = node.control.GetControlPercentMarkerSize(false, true);
5224    requireReAdjust = size.width !== newSize.width;
5225   }
5226   if(node.control.sizingConfig.supportAutoHeight)
5227    autoHeightNodes.push(node);
5228   node.control.ResetControlPercentMarkerSize();
5229  }
5230  for(var childNode, i = 0; childNode = node.children[i]; i++)
5231   requireReAdjust = this.forEachControlCore(childNode, collapseControls, processFunc, adju
5231stNodes, autoHeightNodes) || requireReAdjust;
5232  adjustNodes.push(node);
5233  return requireReAdjust;
5234 },
5235 forEachControlsBackward: function(adjustNodes, collapseControls, processFunc) {
5236  for(var i = 0, node; node = adjustNodes[i]; i++)
5237   this.forEachControlsBackwardCore(node, collapseControls, processFunc);
5238 },
5239 forEachControlsBackwardCore: function(node, collapseControls, processFunc) {
5240  if(node.control)
5241   processFunc(node.control);
5242  if(node.children.length > 1) {
5243   for(var i = 0, childNode; childNode = node.children[i]; i++) {
5244    if(childNode.control)
5245     processFunc(childNode.control);
5246   }
5247  }
5248 },
5249 collapseControls: function(node) {
5250  for(var childNode, i = 0; childNode = node.children[i]; i++)
5251   this.collapseControls(childNode);
5252  if(node.control && node.control.NeedCollapseControl())
5253   node.control.CollapseControl();
5254 },
5255 createControlTree: function(controlCollection, container) {
5256  controlCollection.ProcessControlsInContainer(container, function(control) {
5257   control.RegisterInControlTree(this);
5258  }.aspxBind(this));
5259  var fixedNodes = [];
5260  var fixedNodesChildren = [];
5261  for(var domElementID in this.domMap) {
5262   if(!this.domMap.hasOwnProperty(domElementID)) continue;
5263   var node = this.domMap[domElementID];
5264   var controlOwner = node.control ? node.control.controlOwner : null;
5265   if(controlOwner && this.domMap[controlOwner.name])
5266    continue;
5267   if(this.isFixedNode(node))
5268    fixedNodes.push(node);
5269   else {
5270    var parentNode = this.findParentNode(domElementID);
5271    parentNode = parentNode || this.rootNode;
5272    if(this.isFixedNode(parentNode))
5273     fixedNodesChildren.push(node);
5274    else {
5275     var childNode = node.mainNode || node;
5276     this.addChildNode(parentNode, childNode);
5277    }
5278   }
5279  }
5280  for(var i = fixedNodes.length - 1; i >= 0; i--)
5281   this.insertChildNode(this.rootNode, fixedNodes[i], 0);
5282  for(var i = fixedNodesChildren.length - 1; i >= 0; i--)
5283   this.insertChildNode(this.rootNode, fixedNodesChildren[i], 0);
5284 },
5285 findParentNode: function(id) {
5286  var element = document.getElementById(id).parentNode;
5287  while(element && element.tagName !== "BODY") {
5288   if(element.id) {
5289    var parentNode = this.domMap[element.id];
5290    if(parentNode)
5291     return parentNode;
5292   }
5293   element = element.parentNode;
5294  }
5295  return null;
5296 },
5297 addChildNode: function(node, childNode) {
5298  if(!childNode.parentNode) {
5299   node.children.push(childNode);
5300   childNode.parentNode = node;
5301  }
5302 },
5303 insertChildNode: function(node, childNode, index) {
5304  if(!childNode.parentNode) {
5305   ASPx.Data.ArrayInsert(node.children, childNode, index);
5306   childNode.parentNode = node;
5307  }
5308 },
5309 addRelatedNode: function(node, relatedNode) {
5310  this.addChildNode(node, relatedNode);
5311  relatedNode.mainNode = node;
5312 },
5313 isFixedNode: function(node) {
5314  var control = node.mainNode ? node.mainNode.control : node.control;
5315  return control && control.HasFixedPosition();
5316 },
5317 createNode: function(domElementID, control) {
5318  var node = {
5319   control: control,
5320   children: [],
5321   parentNode: null,
5322   mainNode: null
5323  };
5324  if(domElementID)
5325   this.domMap[domElementID] = node;
5326  return node;
5327 }
5328});
5329function _aspxFunctionIsInCallstack(currentCallee, targetFunction, depthLimit) {
5330 var candidate = currentCallee;
5331 var depth = 0;
5332 while(candidate && depth <= depthLimit) {
5333  candidate = candidate.caller;
5334  if(candidate == targetFunction)
5335   return true;
5336  depth++;
5337 }
5338 return false;
5339}
5340ASPx.Evt.AttachEventToElement(window, "load", aspxClassesWindowOnLoad);
5341function aspxClassesWindowOnLoad(evt){
5342 ASPx.documentLoaded = true;
5343 _aspxSweepDuplicatedLinks();
5344 ResourceManager.SynchronizeResources();
5345 var externalScriptProcessor = GetExternalScriptProcessor();
5346 if(externalScriptProcessor)
5347  externalScriptProcessor.ShowErrorMessages();
5348 ASPx.AccessibilityUtils.initialize();
5349 ASPx.GetControlCollection().Initialize();
5350 _aspxInitializeScripts();
5351 _aspxInitializeLinks();
5352 _aspxInitializeFocus();
5353}
5354Ident = { };
5355Ident.IsDate = function(obj) {
5356 return obj && obj.constructor == Date;
5357};
5358Ident.IsRegExp = function(obj) {
5359 return obj && obj.constructor === RegExp;
5360};
5361Ident.IsArray = function(obj) {
5362 return obj && obj.constructor == Array;
5363};
5364Ident.IsASPxClientCollection = function(obj) {
5365 return obj && obj.isASPxClientCollection;
5366};
5367Ident.IsASPxClientControl = function(obj) {
5368 return obj && obj instanceof ASPxClientControlBase;
5369};
5370Ident.IsASPxClientEdit = function(obj) {
5371 return obj && obj.isASPxClientEdit;
5372};
5373Ident.IsFocusableElementRegardlessTabIndex = function (element) {
5374 var tagName = element.tagName;
5375 return tagName == "TEXTAREA" || tagName == "INPUT" || tagName == "A" || 
5376  tagName == "SELECT" || tagName == "IFRAME" || tagName == "OBJECT";
5377};
5378Ident.isDialogInvisibleControl = function(control) {
5379 return !!ASPx.Dialog && ASPx.Dialog.isDialogInvisibleControl(control);
5380};
5381Ident.scripts = {};
5382if(ASPx.IsFunction(window.WebForm_InitCallbackAddField)) {
5383 (function() {
5384  var original = window.WebForm_InitCallbackAddField;
5385  window.WebForm_InitCallbackAddField = function(name, value) {
5386   if(typeof(name) == "string" && name)
5387    original.apply(null, arguments);
5388  };
5389 })();
5390}
5391ASPx.FireDefaultButton = function(evt, buttonID) {
5392 if(_aspxIsDefaultButtonEvent(evt, buttonID)) {
5393  var defaultButton = ASPx.GetElementById(buttonID);
5394  if(defaultButton && defaultButton.click) {
5395   if(ASPx.IsFocusable(defaultButton))
5396    defaultButton.focus();
5397   ASPx.Evt.DoElementClick(defaultButton);
5398   ASPx.Evt.PreventEventAndBubble(evt);
5399   return false;
5400  }
5401 }
5402 return true;
5403}
5404function _aspxIsDefaultButtonEvent(evt, defaultButtonID) {
5405 if(evt.keyCode != ASPx.Key.Enter)
5406  return false;
5407 var srcElement = ASPx.Evt.GetEventSource(evt);
5408 if(!srcElement || srcElement.id === defaultButtonID)
5409  return true;
5410 var tagName = srcElement.tagName;
5411 var type = srcElement.type;
5412 return tagName != "TEXTAREA" && tagName != "BUTTON" && tagName != "A" &&
5413  (tagName != "INPUT" || type != "checkbox" && type != "radio" && type != "button" && type != "submit" && type != "reset");
5414}
5415var PostHandler = ASPx.CreateClass(null, {
5416 constructor: function() {
5417  this.Post = new ASPxClientEvent();
5418  this.PostFinalization = new ASPxClientEvent();
5419  this.observableForms = [];
5420  this.dxCallbackTriggers = {};
5421  this.lastSubmitElementName = null;
5422  this.beforeOnSubmit = function() { };
5423  this.ReplaceGlobalPostFunctions();
5424  this.HandleDxCallbackBeginning();
5425  this.HandleMSAjaxRequestBeginning();
5426 },
5427 Update: function() {
5428  this.ReplaceFormsSubmit(true);
5429 },
5430 ProcessPostRequest: function(ownerID, isCallback, isMSAjaxRequest, isDXCallback) {
5431  this.cancelPostProcessing = false;
5432  this.isMSAjaxRequest = isMSAjaxRequest;
5433  if(this.SkipRaiseOnPost(ownerID, isCallback, isDXCallback))
5434   return;
5435  var args = new PostHandlerOnPostEventArgs(ownerID, isCallback, isMSAjaxRequest, isDXCallback);
5436  this.Post.FireEvent(this, args);
5437  this.cancelPostProcessing = args.cancel;
5438  if(!args.cancel)
5439   this.PostFinalization.FireEvent(this, args);
5440 },
5441 SkipRaiseOnPost: function(ownerID, isCallback, isDXCallback) { 
5442  if(!isCallback)
5443   return false;
5444  var dxOwner = isDXCallback && ASPx.GetControlCollection().GetByName(ownerID);
5445  if(dxOwner) {
5446   this.dxCallbackTriggers[dxOwner.uniqueID] = true;
5447   return false;
5448  }
5449  if(this.dxCallbackTriggers[ownerID]) {
5450   this.dxCallbackTriggers[ownerID] = false;
5451   return true;
5452  }
5453  return false;
5454 },
5455 ReplaceGlobalPostFunctions: function() {
5456  if(ASPx.IsFunction(window.__doPostBack))
5457   this.ReplaceDoPostBack();
5458  if(ASPx.IsFunction(window.WebForm_DoCallback))
5459   this.ReplaceDoCallback();
5460  this.ReplaceFormsSubmit();
5461 },
5462 HandleDxCallbackBeginning: function() {
5463  ASPx.GetControlCollection().BeforeInitCallback.AddHandler(function(s, e) {
5464   aspxRaisePostHandlerOnPost(e.callbackOwnerID, true, false, true); 
5465  });
5466 },
5467 HandleMSAjaxRequestBeginning: function() {
5468  if(window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager && Sys.WebForms.PageRequestManager.getInstance) {
5469   var pageRequestManager = Sys.WebForms.PageRequestManager.getInstance();
5470   if(pageRequestManager != null && Ident.IsArray(pageRequestManager._onSubmitStatements)) {
5471    pageRequestManager._onSubmitStatements.unshift(function() {
5472     var postbackSettings = Sys.WebForms.PageRequestManager.getInstance()._postBackSettings;
5473     var postHandler = aspxGetPostHandler();
5474     aspxRaisePostHandlerOnPost(postbackSettings.asyncTarget, true, true);
5475     return !postHandler.cancelPostProcessing;
5476    });
5477   }
5478  }
5479 },
5480 ReplaceDoPostBack: function() {
5481  var original = __doPostBack;
5482  __doPostBack = function(eventTarget, eventArgument) {
5483   var postHandler = aspxGetPostHandler();
5484   aspxRaisePostHandlerOnPost(eventTarget);
5485   if(postHandler.cancelPostProcessing)
5486    return;
5487   ASPxClientControl.postHandlingLocked = true;
5488   original(eventTarget, eventArgument);
5489   delete ASPxClientControl.postHandlingLocked;
5490  };
5491 },
5492 ReplaceDoCallback: function() {
5493  var original = WebForm_DoCallback;
5494  WebForm_DoCallback = function(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) {
5495   var postHandler = aspxGetPostHandler();
5496   aspxRaisePostHandlerOnPost(eventTarget, true);
5497   if(postHandler.cancelPostProcessing)
5498    return;
5499   return original(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync);
5500  };
5501 },
5502 ReplaceFormsSubmit: function(checkObservableCollection) {
5503  for(var i = 0; i < document.forms.length; i++) { 
5504   var form = document.forms[i];
5505   if(checkObservableCollection && ASPx.Data.ArrayIndexOf(this.observableForms, form) >= 0)
5506    continue;
5507   if(form.submit)
5508    this.ReplaceFormSubmit(form);
5509   this.ReplaceFormOnSumbit(form);
5510   this.observableForms.push(form);
5511  }
5512 },
5513 ReplaceFormSubmit: function(form) {
5514  var originalSubmit = form.submit;
5515  form.submit = function() {
5516   var postHandler = aspxGetPostHandler();
5517   aspxRaisePostHandlerOnPost();
5518   if(postHandler.cancelPostProcessing)
5519    return false;
5520   var callee = arguments.callee;
5521   this.submit = originalSubmit;
5522   var submitResult = this.submit();
5523   this.submit = callee;
5524   return submitResult;
5525  };
5526  form = null;
5527 },
5528 ReplaceFormOnSumbit: function(form) {
5529  var originalSubmit = form.onsubmit;
5530  form.onsubmit = function() {
5531   var postHandler = aspxGetPostHandler();
5532   postHandler.beforeOnSubmit();
5533   if(postHandler.isMSAjaxRequest)
5534    postHandler.isMsAjaxRequest = false;
5535   else
5536    aspxRaisePostHandlerOnPost(postHandler.GetLastSubmitElementName());
5537   if(postHandler.cancelPostProcessing)
5538    return false;
5539   return ASPx.IsFunction(originalSubmit)
5540    ? originalSubmit.apply(this, arguments)
5541    : true;
5542  };
5543  form = null;
5544 },
5545 SetBeforeOnSubmit: function(action) {
5546  this.beforeOnSubmit = action;
5547 },
5548 SetLastSubmitElementName: function(elementName) {
5549  this.lastSubmitElementName = elementName;
5550 },
5551 GetLastSubmitElementName: function() {
5552  return this.lastSubmitElementName;
5553 },
5554 RemoveDisposedFormsFromCache: function(){
5555  for(var i = 0; this.observableForms && i < this.observableForms.length; i++){
5556   var form = this.observableForms[i];
5557   if(!ASPx.IsExistsElement(form)){
5558    ASPx.Data.ArrayRemove(this.observableForms, form);
5559    i--;
5560   }
5561  }
5562 }
5563});
5564function aspxRaisePostHandlerOnPost(ownerID, isCallback, isMSAjaxRequest, isDXCallback) {
5565 if(ASPxClientControl.postHandlingLocked) return;
5566 var postHandler = aspxGetPostHandler();
5567 if(postHandler)
5568  postHandler.ProcessPostRequest(ownerID, isCallback, isMSAjaxRequest, isDXCallback);
5569}
5570var aspxPostHandler;
5571function aspxGetPostHandler() {
5572 if(!aspxPostHandler)
5573  aspxPostHandler = new PostHandler();
5574 return aspxPostHandler;
5575}
5576var PostHandlerOnPostEventArgs = ASPx.CreateClass(ASPxClientCancelEventArgs, {
5577 constructor: function(ownerID, isCallback, isMSAjaxCallback, isDXCallback){
5578  this.constructor.prototype.constructor.call(this);
5579  this.ownerID = ownerID;
5580  this.isCallback = !!isCallback;
5581  this.isDXCallback = !!isDXCallback;
5582  this.isMSAjaxCallback = !!isMSAjaxCallback;
5583 }
5584});
5585var ResourceManager = {
5586 HandlerStr: "DXR.axd?r=",
5587 ResourceHashes: {},
5588 SynchronizeResources: function(method){
5589  if(!method){
5590   method = function(name, resource) { 
5591    this.UpdateInputElements(name, resource); 
5592   }.aspxBind(this);
5593  }
5594  var resources = this.GetResourcesData();
5595  for(var name in resources)
5596   method(name, resources[name]);
5597 },
5598 GetResourcesData: function(){
5599  return {
5600   DXScript: this.GetResourcesElementsString(_aspxGetIncludeScripts(), "src", "DXScript"),
5601   DXCss: this.GetResourcesElementsString(_aspxGetLinks(), "href", "DXCss")
5602  };
5603 },
5604 GetResourcesElementsString: function(elements, urlAttr, id){
5605  if(!this.ResourceHashes[id]) 
5606   this.ResourceHashes[id] = {};
5607  var hash = this.ResourceHashes[id];
5608  for(var i = 0; i < elements.length; i++) {
5609   var resourceUrl = ASPx.Attr.GetAttribute(elements[i], urlAttr);
5610   if(resourceUrl) {
5611    var pos = resourceUrl.indexOf(this.HandlerStr);
5612    if(pos > -1){
5613     var list = resourceUrl.substr(pos + this.HandlerStr.length);
5614     var ampPos = list.lastIndexOf("-");
5615     if(ampPos > -1)
5616      list = list.substr(0, ampPos);
5617     var indexes = list.split(",");
5618     for(var j = 0; j < indexes.length; j++)
5619      hash[indexes[j]] = indexes[j];
5620    }
5621    else
5622     hash[resourceUrl] = resourceUrl;
5623   }
5624  }
5625  var array = [];
5626  for(var key in hash) 
5627   array.push(key);
5628  return array.join(",");
5629 },
5630 UpdateInputElements: function(typeName, list){
5631  for(var i = 0; i < document.forms.length; i++){
5632   var inputElement = document.forms[i][typeName];
5633   if(!inputElement)
5634    inputElement = this.CreateInputElement(document.forms[i], typeName);
5635   inputElement.value = list;
5636  }
5637 },
5638 CreateInputElement: function(form, typeName){
5639  var inputElement = ASPx.CreateHiddenField(typeName, typeName);
5640  form.appendChild(inputElement);
5641  return inputElement;
5642 }
5643};
5644ASPx.includeScriptPrefix = "dxis_";
5645ASPx.startupScriptPrefix = "dxss_";
5646var includeScriptsCache = {};
5647var createdIncludeScripts = [];
5648var appendedScriptsCount = 0;
5649var callbackOwnerNames = [];
5650var scriptsRestartHandlers = { };
5651function _aspxIsKnownIncludeScript(script) {
5652 return !!includeScriptsCache[script.src];
5653}
5654function _aspxCacheIncludeScript(script) {
5655 includeScriptsCache[script.src] = 1;
5656}
5657function _aspxProcessScriptsAndLinks(ownerName, isCallback) {
5658 if(!ASPx.documentLoaded) return; 
5659 _aspxProcessScripts(ownerName, isCallback);
5660 getLinkProcessor().process();
5661 ASPx.ClearCachedCssRules();
5662}
5663function _aspxGetStartupScripts() {
5664 return _aspxGetScriptsCore(ASPx.startupScriptPrefix);
5665}
5666function _aspxGetIncludeScripts() {
5667 return _aspxGetScriptsCore(ASPx.includeScriptPrefix);
5668}
5669function _aspxGetScriptsCore(prefix) {
5670 var result = [];
5671 var scripts = document.getElementsByTagName("SCRIPT");
5672 for(var i = 0; i < scripts.length; i++) {
5673  if(scripts[i].id.indexOf(prefix) == 0)
5674   result.push(scripts[i]);
5675 }
5676 return result;
5677}
5678function _aspxGetLinks() {
5679 var result = [];
5680 var links = document.getElementsByTagName("LINK");;
5681 for(var i = 0; i < links.length; i++) 
5682  result[i] = links[i];
5683 return result;
5684}
5685function _aspxIsLinksLoaded() {
5686 var links = _aspxGetLinks();
5687 for(var i = 0, link; link = links[i]; i++) {
5688  if(link.readyState && link.readyState.toLowerCase() == "loading")
5689    return false;
5690  }
5691 return true;
5692}
5693function _aspxInitializeLinks() {
5694 var links = _aspxGetLinks();
5695 for(var i = 0; i < links.length; i++)
5696  links[i].loaded = true; 
5697}
5698var scriptExecutedAttrName = "data-executed";
5699function isScriptExecuted(script) {
5700 return ASPx.Attr.GetAttribute(script, scriptExecutedAttrName);
5701}
5702function markScriptAsExecuted(script) {
5703 ASPx.Attr.SetAttribute(script, scriptExecutedAttrName, true);
5704}
5705function _aspxInitializeScripts() {
5706 var scripts = _aspxGetIncludeScripts();
5707 for(var i = 0; i < scripts.length; i++)
5708  _aspxCacheIncludeScript(scripts[i]);   
5709 var startupScripts = _aspxGetStartupScripts();
5710 for(var i = 0; i < startupScripts.length; i++)
5711  markScriptAsExecuted(startupScripts[i]);
5712}
5713function _aspxSweepDuplicatedLinks() {
5714 var hash = { };
5715 var links = _aspxGetLinks();
5716 for(var i = 0; i < links.length; i++) {
5717  var href = links[i].href;
5718  if(!href)
5719   continue;
5720  if(hash[href]){
5721   if((ASPx.Browser.IE || !hash[href].loaded) && links[i].loaded) {
5722    ASPx.RemoveElement(hash[href]);
5723    hash[href] = links[i];
5724   }
5725   else
5726    ASPx.RemoveElement(links[i]);
5727  }
5728  else
5729   hash[href] = links[i];
5730 }
5731}
5732function _aspxSweepDuplicatedScripts() {
5733 var hash = { };
5734 var scripts = _aspxGetIncludeScripts();
5735 for(var i = 0; i < scripts.length; i++) {
5736  var src = scripts[i].src;
5737  if(!src) continue;
5738  if(hash[src])
5739   ASPx.RemoveElement(scripts[i]);
5740  else
5741   hash[src] = scripts[i];
5742 }
5743}
5744function _aspxProcessScripts(ownerName, isCallback) {
5745 var scripts = _aspxGetIncludeScripts();
5746 var previousCreatedScript = null;
5747 var firstCreatedScript = null;
5748 for(var i = 0; i < scripts.length; i++) {
5749  var script = scripts[i];
5750  if(script.src == "") continue; 
5751  if(_aspxIsKnownIncludeScript(script))
5752   continue;
5753  var createdScript = document.createElement("script");
5754  createdScript.type = "text/javascript";
5755  createdScript.src = script.src;
5756  createdScript.id = script.id;
5757  function AreScriptsEqual(script1, script2) {
5758   return script1.src == script2.src;
5759  }
5760  if(ASPx.Data.ArrayIndexOf(createdIncludeScripts, createdScript, AreScriptsEqual) >= 0)
5761   continue;
5762  createdIncludeScripts.push(createdScript);
5763  ASPx.RemoveElement(script);
5764  if(ASPx.Browser.IE && ASPx.Browser.Version < 9) {
5765   createdScript.onreadystatechange = new Function("ASPx.OnScriptReadyStateChangedCallback(this, " + isCallback + ");");
5766  } else if(ASPx.Browser.Edge || ASPx.Browser.WebKitFamily || (ASPx.Browser.Firefox && ASPx.Browser.Version >= 4) || ASPx.Browser.IE && ASPx.Browser.Version >= 9) {
5767   createdScript.onload = new Function("ASPx.OnScriptLoadCallback(this, " + isCallback + ");");
5768   if(firstCreatedScript == null)
5769    firstCreatedScript = createdScript;
5770   createdScript.nextCreatedScript = null;
5771   if(previousCreatedScript != null)
5772    previousCreatedScript.nextCreatedScript = createdScript;
5773   previousCreatedScript = createdScript;
5774  } else {
5775   createdScript.onload = new Function("ASPx.OnScriptLoadCallback(this);");
5776   ASPx.AppendScript(createdScript);
5777   _aspxCacheIncludeScript(createdScript);
5778  }
5779 }
5780 if(firstCreatedScript != null) {
5781  ASPx.AppendScript(firstCreatedScript);
5782  _aspxCacheIncludeScript(firstCreatedScript);
5783 }
5784 if(isCallback)
5785  callbackOwnerNames.push(ownerName);
5786 if(createdIncludeScripts.length == 0) {
5787  var newLinks = ASPx.GetNodesByTagName(document.body, "link");
5788  var needProcessLinks = isCallback && newLinks.length > 0;
5789  if(needProcessLinks)
5790   needProcessLinks = getLinkProcessor().addLinks(newLinks);
5791  if(!needProcessLinks)
5792   ASPx.FinalizeScriptProcessing(isCallback);
5793 }
5794}
5795ASPx.FinalizeScriptProcessing = function(isCallback) {
5796 createdIncludeScripts = [];
5797 appendedScriptsCount = 0;
5798 var linkProcessor = getLinkProcessor();
5799 if(linkProcessor.hasLinks())
5800  _aspxSweepDuplicatedLinks();
5801 linkProcessor.reset();
5802 _aspxSweepDuplicatedScripts();
5803 _aspxRunStartupScripts(isCallback);
5804 ResourceManager.SynchronizeResources();
5805}
5806var startupScriptsRunning = false;
5807function _aspxRunStartupScripts(isCallback) {
5808 startupScriptsRunning = true;
5809 try {
5810  _aspxRunStartupScriptsCore();
5811 }
5812 finally {
5813  startupScriptsRunning = false;
5814 }
5815 if(ASPx.documentLoaded) {
5816  ASPx.GetControlCollection().InitializeElements(isCallback);
5817  for(var key in scriptsRestartHandlers)
5818   scriptsRestartHandlers[key]();
5819  _aspxRunEndCallbackScript();
5820 }
5821}
5822function _aspxIsStartupScriptsRunning(isCallback) {
5823 return startupScriptsRunning;
5824}
5825function _aspxRunStartupScriptsCore() {
5826 var scripts = _aspxGetStartupScripts();
5827 var code;
5828 for(var i = 0; i < scripts.length; i++){
5829  if(!isScriptExecuted(scripts[i])) {
5830   code = ASPx.GetScriptCode(scripts[i]);
5831   eval(code);
5832   markScriptAsExecuted(scripts[i]);
5833  }
5834 }
5835}
5836function _aspxRunEndCallbackScript() {
5837 while(callbackOwnerNames.length > 0) {
5838  var callbackOwnerName = callbackOwnerNames.pop();
5839  var callbackOwner = ASPx.GetControlCollection().Get(callbackOwnerName);
5840  if(callbackOwner)
5841   callbackOwner.DoEndCallback();
5842 }
5843}
5844ASPx.OnScriptReadyStateChangedCallback = function(scriptElement, isCallback) {
5845 if(scriptElement.readyState == "loaded") {
5846  _aspxCacheIncludeScript(scriptElement);
5847  for(var i = 0; i < createdIncludeScripts.length; i++) {
5848   var script = createdIncludeScripts[i];
5849   if(_aspxIsKnownIncludeScript(script)) {
5850    if(!isScriptExecuted(script)) {
5851     markScriptAsExecuted(script);
5852     ASPx.AppendScript(script);
5853     appendedScriptsCount++;
5854    }
5855   } else
5856    break;
5857  }
5858  if(createdIncludeScripts.length == appendedScriptsCount)
5859   ASPx.FinalizeScriptProcessing(isCallback);
5860 }
5861}
5862ASPx.OnScriptLoadCallback = function(scriptElement, isCallback) {
5863 appendedScriptsCount++;
5864 if(scriptElement.nextCreatedScript) {
5865  ASPx.AppendScript(scriptElement.nextCreatedScript);
5866  _aspxCacheIncludeScript(scriptElement.nextCreatedScript);
5867 }
5868 if(createdIncludeScripts.length == appendedScriptsCount)
5869  ASPx.FinalizeScriptProcessing(isCallback);
5870}
5871function _aspxAddScriptsRestartHandler(objectName, handler) {
5872 scriptsRestartHandlers[objectName] = handler;
5873}
5874function _aspxMoveLinkElements() {
5875 var head = ASPx.GetNodesByTagName(document, "head")[0];
5876 var bodyLinks = ASPx.GetNodesByTagName(document.body, "link");
5877 if(head && bodyLinks.length > 0){
5878  var headLinks = ASPx.GetNodesByTagName(head, "link");
5879  var dxLinkAnchor = head.firstChild;
5880  for(var i = 0; i < headLinks.length; i++){
5881   if(headLinks[i].href.indexOf(ResourceManager.HandlerStr) > -1)
5882    dxLinkAnchor = headLinks[i].nextSibling;
5883  }
5884  while(bodyLinks.length > 0) 
5885   head.insertBefore(bodyLinks[0], dxLinkAnchor);
5886 }
5887}
5888var LinkProcessor = ASPx.CreateClass(null, {
5889 constructor: function() {
5890  this.loadedLinkCount = 0;
5891  this.linkInfos = [];
5892  this.loadingObservationTimerID = -1;
5893 },
5894 process: function() {
5895  if(this.hasLinks()) {
5896   if(this.isLinkLoadEventSupported())
5897    this.processViaLoadEvent();
5898   else
5899    this.processViaTimer();
5900  }
5901  else
5902   _aspxSweepDuplicatedLinks();
5903  _aspxMoveLinkElements();
5904 },
5905 addLinks: function(links) {
5906  var prevLinkCount = this.linkInfos.length;
5907  for(var i = 0; i < links.length; i++) {
5908   var link = links[i];
5909   if(link.loaded || link.rel != "stylesheet" || link.type != "text/css" || link.href.toLowerCase().indexOf("dxr.axd?r=") == -1)
5910    continue;
5911   var linkInfo = {
5912    link: link,
5913    href: link.href
5914   };
5915   this.linkInfos.push(linkInfo);
5916  }
5917  return prevLinkCount != this.linkInfos.length;
5918 },
5919 hasLinks: function() {
5920  return this.linkInfos.length > 0;
5921 },
5922 reset: function() {
5923  this.linkInfos = [];
5924  this.loadedLinkCount = 0;
5925 },
5926 processViaLoadEvent: function() {
5927  for(var i = 0, linkInfo; linkInfo = this.linkInfos[i]; i++) {
5928   if(ASPx.Browser.IE && ASPx.Browser.Version < 9) {
5929    var that = this;
5930    linkInfo.link.onreadystatechange = function() { that.onLinkReadyStateChanged(this); };
5931   }
5932   else
5933    linkInfo.link.onload = this.onLinkLoad.aspxBind(this);
5934  }
5935 },
5936 isLinkLoadEventSupported: function() {
5937  return !(ASPx.Browser.Chrome && ASPx.Browser.MajorVersion < 19 || ASPx.Browser.Firefox && ASPx.Browser.MajorVersion < 9 ||
5938   ASPx.Browser.Safari && ASPx.Browser.MajorVersion < 6 || ASPx.Browser.AndroidDefaultBrowser && ASPx.Browser.MajorVersion < 4.4);
5939 },
5940 processViaTimer: function() {
5941  if(this.loadingObservationTimerID == -1)
5942   this.onLinksLoadingObserve();
5943 },
5944 onLinksLoadingObserve: function() {
5945  if(this.getIsAllLinksLoaded()) {
5946   this.loadingObservationTimerID = -1;
5947   this.onAllLinksLoad();
5948  }
5949  else
5950   this.loadingObservationTimerID = window.setTimeout(this.onLinksLoadingObserve.aspxBind(this), 100);
5951 },
5952 getIsAllLinksLoaded: function() {
5953  var styleSheets = document.styleSheets;
5954  var loadedLinkHrefs = { };
5955  for(var i = 0; i < styleSheets.length; i++) {
5956   var styleSheet = styleSheets[i];
5957   try {
5958    if(styleSheet.cssRules)
5959     loadedLinkHrefs[styleSheet.href] = 1;
5960   }
5961   catch(ex) { }
5962  }
5963  var loadedLinksCount = 0;
5964  for(var i = 0, linkInfo; linkInfo = this.linkInfos[i]; i++) {
5965   if(loadedLinkHrefs[linkInfo.href])
5966    loadedLinksCount++;
5967  }
5968  return loadedLinksCount == this.linkInfos.length;
5969 },
5970 onAllLinksLoad: function() {
5971  this.reset();
5972  _aspxSweepDuplicatedLinks();
5973  if(createdIncludeScripts.length == 0)
5974   ASPx.FinalizeScriptProcessing(true);
5975 },
5976 onLinkReadyStateChanged: function(linkElement) {
5977  if(linkElement.readyState == "complete")
5978   this.onLinkLoadCore(linkElement);
5979 },
5980 onLinkLoad: function(evt) {
5981  var linkElement = ASPx.Evt.GetEventSource(evt);
5982  this.onLinkLoadCore(linkElement);
5983 },
5984 onLinkLoadCore: function(linkElement) {
5985  if(!this.hasLinkElement(linkElement)) return;
5986  this.loadedLinkCount++;
5987  if(!ASPx.Browser.Firefox && this.loadedLinkCount == this.linkInfos.length || 
5988   ASPx.Browser.Firefox && this.loadedLinkCount == 2 * this.linkInfos.length) {
5989   this.onAllLinksLoad();
5990  }
5991 },
5992 hasLinkElement: function(linkElement) {
5993  for(var i = 0, linkInfo; linkInfo = this.linkInfos[i]; i++) {
5994   if(linkInfo.link == linkElement)
5995    return true;
5996  }
5997  return false;
5998 }
5999});
6000var linkProcessor = null;
6001function getLinkProcessor() {
6002 if(linkProcessor == null)
6003  linkProcessor = new LinkProcessor();
6004 return linkProcessor;
6005}
6006var IFrameHelper = ASPx.CreateClass(null, {
6007 constructor: function(params) {
6008  this.params = params || {};
6009  this.params.src = this.params.src || "";
6010  this.CreateElements();
6011 },
6012 CreateElements: function() {
6013  var elements = IFrameHelper.Create(this.params);
6014  this.containerElement = elements.container;
6015  this.iframeElement = elements.iframe;
6016  this.AttachOnLoadHandler(this, this.iframeElement);
6017  this.SetLoading(true);
6018  if(this.params.onCreate)
6019   this.params.onCreate(this.containerElement, this.iframeElement);
6020 },
6021 AttachOnLoadHandler: function(instance, element) {
6022  ASPx.Evt.AttachEventToElement(element, "load", function() {
6023   instance.OnLoad(element);
6024  });
6025 },
6026 OnLoad: function(element) {
6027  this.SetLoading(false, element);
6028  if(!element.preventCustomOnLoad && this.params.onLoad)
6029   this.params.onLoad();
6030 },
6031 IsLoading: function(element) {
6032  element = element || this.iframeElement;
6033  if(element)
6034   return element.loading;
6035  return false;
6036 },
6037 SetLoading: function(value, element) {
6038  element = element || this.iframeElement;
6039  if(element)
6040   element.loading = value;
6041 },
6042 GetContentUrl: function() {
6043  return this.params.src;
6044 },
6045 SetContentUrl: function(url, preventBrowserCaching) {
6046  if(url) {
6047   this.params.src = url;
6048   if(preventBrowserCaching)
6049    url = IFrameHelper.AddRandomParamToUrl(url);
6050   this.SetLoading(true);
6051   this.iframeElement.src = url;
6052  }
6053 },
6054 RefreshContentUrl: function() {
6055  if(this.IsLoading())
6056   return;
6057  this.SetLoading(true);
6058  var oldContainerElement = this.containerElement;
6059  var oldIframeElement = this.iframeElement;
6060  var postfix = "_del" + Math.floor(Math.random()*100000).toString();
6061  if(this.params.id)
6062   oldIframeElement.id = this.params.id + postfix;
6063  if(this.params.name)
6064   oldIframeElement.name = this.params.name + postfix;
6065  ASPx.SetStyles(oldContainerElement, { height: 0 });
6066  this.CreateElements();
6067  oldIframeElement.preventCustomOnLoad = true;
6068  oldIframeElement.src = ASPx.BlankUrl;
6069  window.setTimeout(function() {
6070   oldContainerElement.parentNode.removeChild(oldContainerElement);
6071  }, 10000); 
6072 }
6073});
6074IFrameHelper.Create = function(params) {
6075 var iframeHtmlStringParts = [ "<iframe frameborder='0'" ];
6076 if(params) {
6077  if(params.id)
6078   iframeHtmlStringParts.push(" id='", params.id, "'");
6079  if(params.name)
6080   iframeHtmlStringParts.push(" name='", params.name, "'");
6081  if(params.title)
6082   iframeHtmlStringParts.push(" title='", params.title, "'");
6083  if(params.scrolling)
6084   iframeHtmlStringParts.push(" scrolling='", params.scrolling, "'");
6085  if(params.src)
6086   iframeHtmlStringParts.push(" src='", params.src, "'");
6087 }
6088 iframeHtmlStringParts.push("></iframe>");
6089 var containerElement = ASPx.CreateHtmlElementFromString("<div style='border-width: 0px; padding: 0px; margin: 0px'></div>");
6090 var iframeElement = ASPx.CreateHtmlElementFromString(iframeHtmlStringParts.join(""));
6091 containerElement.appendChild(iframeElement);
6092 return {
6093  container: containerElement,
6094  iframe: iframeElement
6095 };
6096};
6097IFrameHelper.AddRandomParamToUrl = function(url) {
6098 var prefix = url.indexOf("?") > -1
6099  ? "&"
6100  : "?";
6101 var param = prefix + Math.floor(Math.random()*100000).toString();
6102 var anchorIndex = url.indexOf("#");
6103 return anchorIndex == -1
6104  ? url + param
6105  : url.substr(0, anchorIndex) + param + url.substr(anchorIndex);
6106};
6107IFrameHelper.GetWindow = function(name) {
6108 if(ASPx.Browser.IE)
6109  return window.frames[name].window;
6110 else{
6111  var frameElement = document.getElementById(name);
6112  return (frameElement != null) ? frameElement.contentWindow : null;
6113 }
6114};
6115IFrameHelper.GetDocument = function(name) {
6116 var frameElement;
6117 if(ASPx.Browser.IE) {
6118  frameElement = window.frames[name];
6119  return (frameElement != null) ? frameElement.document : null;
6120 }
6121 else {
6122  frameElement = document.getElementById(name);
6123  return (frameElement != null) ? frameElement.contentDocument : null;
6124 }
6125};
6126IFrameHelper.GetDocumentBody = function(name) {
6127 var doc = IFrameHelper.GetDocument(name);
6128 return (doc != null) ? doc.body : null;
6129};
6130IFrameHelper.GetDocumentHead = function (name) {
6131 var doc = IFrameHelper.GetDocument(name);
6132 return (doc != null) ? doc.head || doc.getElementsByTagName('head')[0] : null;
6133};
6134IFrameHelper.GetElement = function(name) {
6135 if(ASPx.Browser.IE)
6136  return window.frames[name].window.frameElement;
6137 else
6138  return document.getElementById(name);
6139};
6140var KbdHelper = ASPx.CreateClass(null, {
6141 constructor: function(control) {
6142  this.control = control;
6143 },
6144 Init: function() {
6145  KbdHelper.GlobalInit();
6146  var elements = this.getFocusableElements();
6147  for(var i = 0; i < elements.length; i++) {
6148   var element = elements[i];
6149   element.tabIndex = Math.max(element.tabIndex, 0);
6150   var instance = this;
6151   ASPx.Evt.AttachEventToElement(element, "click", function(e) {
6152    instance.HandleClick(e);
6153   });  
6154   ASPx.Evt.AttachEventToElement(element, "focus", function(e) {    
6155    if(!instance.CanFocus(e))
6156     return true;
6157    KbdHelper.active = instance;
6158   });
6159   ASPx.Evt.AttachEventToElement(element, "blur", function () {
6160    instance.onBlur();
6161   }); 
6162  }   
6163 },
6164 getFocusableElements: function() {
6165  return [this.GetFocusableElement()]; 
6166 },
6167 GetFocusableElement: function() { return this.control.GetMainElement(); },
6168 canHandleNoFocusAction: function() { 
6169  var focusableElements = this.getFocusableElements();
6170  for(var i = 0; i < focusableElements.length; i++) {
6171   if(focusableElements[i] === _aspxGetFocusedElement())
6172    return false;
6173  }
6174  return true;
6175 },
6176 CanFocus: function(e) {
6177  var tag = ASPx.Evt.GetEventSource(e).tagName;
6178  if(tag == "A" || tag == "TEXTAREA" || tag == "INPUT" || tag == "SELECT" || tag == "IFRAME" || tag == "OBJECT")
6179   return false; 
6180  return true;
6181 },
6182 HandleClick: function(e) {
6183  if(!this.CanFocus(e))
6184   return;
6185  this.Focus();
6186 },
6187 Focus: function() {
6188  try {
6189   this.GetFocusableElement().focus();   
6190  } catch(e) {
6191  }
6192 },
6193 onBlur: function(){
6194  delete KbdHelper.active;
6195 },
6196 HandleKeyDown: function(e) { }, 
6197 HandleKeyPress: function(e) { }, 
6198 HandleKeyUp: function (e) { },
6199 HandleNoFocusAction: function(e) { },
6200 FocusByAccessKey: function () { }
6201});
6202KbdHelper.GlobalInit = function() {
6203 if(KbdHelper.ready)
6204  return;
6205 ASPx.Evt.AttachEventToDocument("keydown", KbdHelper.OnKeyDown);
6206 ASPx.Evt.AttachEventToDocument("keypress", KbdHelper.OnKeyPress);
6207 ASPx.Evt.AttachEventToDocument("keyup", KbdHelper.OnKeyUp);
6208 KbdHelper.ready = true; 
6209};
6210KbdHelper.swallowKey = false;
6211KbdHelper.accessKeys = { };
6212KbdHelper.ProcessKey = function(e, actionName) {
6213 if(!KbdHelper.active) 
6214  return;
6215 if (KbdHelper.active.canHandleNoFocusAction()) {
6216  KbdHelper.active["HandleNoFocusAction"](e, actionName);
6217  return;
6218 }
6219 var ctl = KbdHelper.active.control;
6220 if(ctl !== ASPx.GetControlCollection().Get(ctl.name)) {
6221  delete KbdHelper.active;
6222  return;
6223 }
6224 if(!KbdHelper.swallowKey) 
6225  KbdHelper.swallowKey = KbdHelper.active[actionName](e);
6226 if(KbdHelper.swallowKey)
6227  ASPx.Evt.PreventEvent(e);
6228};
6229KbdHelper.OnKeyDown = function(e) {
6230 KbdHelper.swallowKey = false;
6231 if(KbdHelper.TryAccessKey(KbdHelper.getKeyName(e)))
6232  ASPx.Evt.PreventEvent(e);
6233 else 
6234  KbdHelper.ProcessKey(e, "HandleKeyDown"); 
6235};
6236KbdHelper.OnKeyPress = function(e) { KbdHelper.ProcessKey(e, "HandleKeyPress"); };
6237KbdHelper.OnKeyUp = function(e) { KbdHelper.ProcessKey(e, "HandleKeyUp"); };
6238KbdHelper.RegisterAccessKey = function(obj) {
6239 if(obj.accessKey)
6240  var key = "CtrlShift" + obj.accessKey;
6241 else if(obj.keyTipModeShortcut)
6242  var key = obj.keyTipModeShortcut;
6243 if(!key) return;
6244 KbdHelper.accessKeys[key.toLowerCase()] = obj.name;
6245};
6246KbdHelper.TryAccessKey = function(code) {
6247 var key = code.toLowerCase ? code.toLowerCase() : String.fromCharCode(code).toLowerCase();
6248 var name = KbdHelper.accessKeys[key];
6249 if(!name) return false;
6250 var obj = ASPx.GetControlCollection().Get(name);
6251 return KbdHelper.ClickAccessKey(obj);
6252};
6253KbdHelper.ClickAccessKey = function (control) {
6254 if (!control) return false;
6255 var el = control.GetMainElement();
6256 if (!el) return false;
6257 el.focus();
6258 setTimeout(function () {
6259  if (KbdHelper.active && KbdHelper.active.FocusByAccessKey)
6260   KbdHelper.active.FocusByAccessKey();
6261 }.aspxBind(this), 100);
6262 return true;
6263};
6264KbdHelper.getKeyName = function(e) {
6265 var name = "";
6266 if(e.altKey)
6267  name += "Alt";
6268 if(e.ctrlKey)
6269  name += "Ctrl";
6270 if(e.shiftKey)
6271  name += "Shift";
6272 var keyCode = e.key || e.code || String.fromCharCode(ASPx.Evt.GetKeyCode(e));
6273 if(keyCode.match(/key/i))
6274  name += keyCode.replace(/key/i, "");
6275 else if(keyCode.match(/digit/i))
6276  name += keyCode.replace(/digit/i, "");
6277 else if(keyCode.match(/arrow/i))
6278  name += keyCode.replace(/arrow/i, "");
6279 else if(keyCode.match(/ins/i))
6280  name += "Ins"
6281 else if(keyCode.match(/del/i))
6282  name += "Del"
6283 else if(keyCode.match(/back/i))
6284  name += "Back"
6285 else if(!keyCode.match(/alt/i) && !keyCode.match(/control/i) && !keyCode.match(/shift/i))
6286  name += keyCode;
6287 return name.replace(/^a-zA-Z0-9/, "");
6288};
6289AccessKeysHelper = ASPx.CreateClass(KbdHelper, {
6290 constructor: function (control) {
6291  this.constructor.prototype.constructor.call(this, control);
6292  this.accessKeysVisible = false;
6293  this.activeKey = null;
6294  this.accessKey = new AccessKey(control.accessKey);
6295  this.accessKeys = this.accessKey.accessKeys;
6296  this.charIndex = 0;
6297  this.onFocusByAccessKey = null;
6298  this.onClose = null;
6299  this.manualStopProcessing = false;
6300  this.isActive = false;
6301 },
6302 Init: function (control) {
6303  KbdHelper.prototype.Init.call(this);
6304  KbdHelper.RegisterAccessKey(control);   
6305 },
6306 Add: function (accessKey) {
6307  this.accessKey.Add(accessKey);
6308 },
6309 HandleKeyDown: function (e) {
6310  var control = this.control;
6311  var keyCode = ASPx.Evt.GetKeyCode(e);
6312  var restoreFocus = false;
6313  var stopProcessing = this.processKeyDown(keyCode);
6314  if (stopProcessing.value) {
6315   this.stopProcessing();
6316   if(this.onClosedOnEscape && (keyCode == ASPx.Key.Esc || stopProcessing.fireEvent))
6317    this.onClosedOnEscape();
6318  }
6319  return stopProcessing;
6320 },
6321 HandleNoFocusAction: function (e, actionName) {
6322  var keyCode = ASPx.Evt.GetKeyCode(e);
6323  if (this.onClosedOnEscape && keyCode == ASPx.Key.Esc && actionName == "HandleKeyDown")
6324   this.onClosedOnEscape();
6325 },
6326 Activate: function () {
6327  KbdHelper.ClickAccessKey(this.control);
6328 },
6329 Stop: function() {
6330  this.stopProcessing();
6331 },
6332 stopProcessing: function () {
6333  this.HideAccessKeys();
6334  if (KbdHelper.active && this.isActive) {
6335   this.isActive = false;
6336   KbdHelper.active.control.GetMainElement().blur();
6337   delete KbdHelper.active;
6338  }
6339 },
6340 onBlur: function () {
6341  if (this.manualStopProcessing) {
6342   this.manualStopProcessing = false;
6343   return;
6344  }
6345  this.HideAccessKeys();
6346  KbdHelper.prototype.onBlur.call(this);
6347 },
6348 processKeyDown: function (keyCode) {
6349  switch (keyCode) {
6350   case ASPx.Key.Left:
6351    this.TryMoveFocusLeft();
6352    return { value: false };
6353   case ASPx.Key.Right:
6354    this.TryMoveFocusRight();
6355    return { value: false };
6356   case ASPx.Key.Esc:
6357    if(this.control.hideAllPopups)
6358     this.control.hideAllPopups(true, true);
6359    if(this.activeKey)
6360     this.activeKey = this.activeKey.Return();
6361    this.charIndex = 0;
6362    if (!this.activeKey)
6363     return { value: true };
6364    break;
6365   case ASPx.Key.Enter:
6366    return { value: true };
6367   default:
6368    var char = String.fromCharCode(keyCode).toUpperCase();
6369    var needToContinue = { value: false };
6370    if(this.activeKey)
6371     var keyResult = this.activeKey.TryAccessKey(char, this.charIndex, needToContinue);
6372    if (needToContinue.value) {
6373     this.charIndex++;
6374     return { value: false };;
6375    }
6376    this.charIndex = 0;
6377    if(keyResult !== undefined)
6378     this.activeKey = keyResult;
6379    else
6380     return { value: true, fireEvent: true };
6381    if (!this.activeKey || !this.activeKey.accessKeys || this.activeKey.accessKeys.length == 0) {
6382     if (this.activeKey && this.activeKey.manualStopProcessing) {
6383      this.manualStopProcessing = true;
6384      break;
6385     }
6386     return { value: true, fireEvent: true };
6387    }
6388  }
6389  return { value: false };
6390 },
6391 TryMoveFocusLeft: function (modifier) {},
6392 TryMoveFocusRight: function (modifier) {},
6393 TryMoveFocusUp: function (modifier) {},
6394 TryMoveFocusDown: function (modifier) {},
6395 FocusByAccessKey: function () {
6396  if (this.onFocusByAccessKey)
6397   this.onFocusByAccessKey();
6398  this.HideAccessKeys();
6399  KbdHelper.prototype.FocusByAccessKey.call(this);
6400  this.activeKey = this.accessKey;
6401  this.activeKey.execute();
6402  this.isActive = true;
6403 },
6404 HideAccessKeys: function(){
6405  this.hideAccessKeys(this.accessKey);
6406 }, 
6407 hideAccessKeys: function (accessKey) {
6408  for (var i = 0, ak; ak = accessKey.accessKeys[i]; i++) {
6409   this.hideAccessKeys(ak);
6410  }
6411  if (accessKey)
6412   accessKey.hide();
6413 },
6414 HandleClick: function(e) {
6415  KbdHelper.prototype.HandleClick.call(this, e);
6416  this.stopProcessing();
6417 }
6418});
6419AccessKey = ASPx.CreateClass(null, {
6420 constructor: function (popupItem, getPopupElement, keyTipElement, key, onlyClick, manualStopProcessing) {
6421  this.key = key ? key : keyTipElement ? ASPxClientUtils.Trim(ASPx.GetInnerText(keyTipElement)) : null;
6422  this.popupItem = popupItem;
6423  this.getPopupElement = getPopupElement;
6424  this.keyTipElement = keyTipElement;
6425  this.accessKeys = [];
6426  this.needShowChilds = true;
6427  this.parent = null;
6428  this.onlyClick = onlyClick;
6429  this.manualStopProcessing = manualStopProcessing;
6430 },
6431 Add: function (accessKey) {
6432  this.accessKeys.push(accessKey);
6433  accessKey.parent = this;
6434 },
6435 TryAccessKey: function (char, index, needToContinue) {
6436  if (!this.accessKeys || this.accessKeys.length == 0)
6437   return;
6438  for (var i = 0, accessKey; accessKey = this.accessKeys[i]; i++) {
6439   if (accessKey.key[index] == char && accessKey.isVisible()) {
6440    if (accessKey.key[index + 1]) {
6441     needToContinue.value = true;
6442    }
6443    else {
6444     accessKey.execute();
6445     return accessKey;
6446    }
6447   } else {
6448    accessKey.hide();
6449   }
6450  }
6451  for (var i = 0, accessKey; accessKey = this.accessKeys[i]; i++) {
6452   var key = accessKey.TryAccessKey(char, index, needToContinue);
6453   if (key)
6454    return key;
6455  }
6456  return;
6457 },
6458 isVisible: function(){
6459  return ASPx.GetElementVisibility(this.keyTipElement);
6460 },
6461 Return: function () {
6462  this.hideChildAccessKeys();
6463  if (this.parent) {
6464   this.parent.showAccessKeys(true);
6465  }  
6466  return this.parent;
6467 },
6468 execute: function () {
6469  this.hideAll();
6470  if (this.popupItem && this.popupItem.accessKeyClick && !this.onlyClick)
6471   this.popupItem.accessKeyClick();
6472  if (this.getPopupElement && this.onlyClick)
6473   ASPx.Evt.EmulateMouseClick(this.getPopupElement());
6474  if (this.accessKeys)
6475   setTimeout(function () {
6476    this.showAccessKeys(true);
6477   }.aspxBind(this), 100);
6478 },
6479 showAccessKeys: function (directShow) {
6480  if (!directShow && !this.needShowChilds)
6481   return;
6482  for (var i = 0; i < this.accessKeys.length; i++) {
6483   var accessKey = this.accessKeys[i];
6484   if (accessKey) {
6485    var popupElement = accessKey.getPopupElement ? accessKey.getPopupElement() : null;
6486    if (popupElement && ASPx.IsElementVisible(popupElement, true)) {
6487     this.show(accessKey);
6488    }
6489    accessKey.showAccessKeys();
6490   }
6491  }
6492 },
6493 show: function (accessKey) {
6494  var keyTipElement = accessKey.keyTipElement;
6495  var popupElement = accessKey.getPopupElement();
6496  var top = ASPx.GetAbsolutePositionY(popupElement);
6497  var left = ASPx.GetAbsolutePositionX(popupElement);
6498  if (accessKey.popupItem.getAccessKeyPosition)
6499   switch (accessKey.popupItem.getAccessKeyPosition()) {
6500    case "AboveRight":
6501     left = left + popupElement.offsetWidth - keyTipElement.offsetWidth / 3;
6502     top = top - keyTipElement.offsetHeight / 2;
6503     break;
6504    case "Right":
6505     left = left + popupElement.offsetWidth - keyTipElement.offsetWidth / 3;
6506     top = top + popupElement.offsetHeight / 2 - keyTipElement.offsetHeight / 2;
6507     break;
6508    case "BelowRight":
6509     left = left + popupElement.offsetWidth - keyTipElement.offsetWidth / 3;
6510     top = top + keyTipElement.offsetHeight / 2;
6511     break;
6512    default:
6513     top = top + popupElement.offsetHeight;
6514     left = left + popupElement.offsetWidth / 2 - keyTipElement.offsetWidth / 2;
6515     break;
6516   }
6517  else {
6518   top = top + popupElement.offsetHeight;
6519   left = left + popupElement.offsetWidth / 2 - keyTipElement.offsetWidth / 2;
6520  }
6521  ASPx.SetAbsoluteY(keyTipElement, top);
6522  ASPx.SetAbsoluteX(keyTipElement, left);
6523  ASPx.SetElementVisibility(keyTipElement, true); 
6524 },
6525 hide: function () {
6526  if (this.keyTipElement)
6527   ASPx.SetElementVisibility(this.keyTipElement, false);
6528 },
6529 hideChildAccessKeys: function () {
6530  this.hideAccessKeys(this.accessKeys);
6531 },
6532 hideAccessKeys: function (accessKeys) {
6533  if (accessKeys) {
6534   for (var i = 0, accessKey; accessKey = accessKeys[i]; i++) {
6535    if (accessKey.keyTipElement)
6536     accessKey.hide();
6537    accessKey.hideChildAccessKeys();
6538   }
6539  }
6540 },
6541 hideAll: function () {
6542  this.getRoot(this).hideChildAccessKeys();
6543 },
6544 getRoot: function (accessKey) {
6545  if (!accessKey.parent)
6546   return accessKey;
6547  return this.getRoot(accessKey.parent);
6548 }
6549});
6550var focusedElement = null;
6551function aspxOnElementFocused(evt) {
6552 evt = ASPx.Evt.GetEvent(evt);
6553 if(evt && evt.target)
6554  focusedElement = evt.target;
6555}
6556function _aspxInitializeFocus() {
6557 if(!ASPx.GetActiveElement())
6558  ASPx.Evt.AttachEventToDocument("focus", aspxOnElementFocused);
6559}
6560function _aspxGetFocusedElement() {
6561 var activeElement = ASPx.GetActiveElement();
6562 return activeElement ? activeElement : focusedElement;
6563}
6564CheckBoxCheckState = {
6565 Checked : "Checked",
6566 Unchecked : "Unchecked",
6567 Indeterminate : "Indeterminate"
6568};
6569CheckBoxInputKey = { 
6570 Checked : "C",
6571 Unchecked : "U",
6572 Indeterminate : "I"
6573};
6574var CheckableElementStateController = ASPx.CreateClass(null, {
6575 constructor: function(imageProperties) {
6576  this.checkBoxStates = [];
6577  this.imageProperties = imageProperties;
6578 },
6579 GetValueByInputKey: function(inputKey) {
6580  return this.GetFirstValueBySecondValue("Value", "StateInputKey", inputKey);
6581 },
6582 GetInputKeyByValue: function(value) {
6583  return this.GetFirstValueBySecondValue("StateInputKey", "Value", value);
6584 },
6585 GetImagePropertiesNumByInputKey: function(value) {
6586  return this.GetFirstValueBySecondValue("ImagePropertiesNumber", "StateInputKey", value);
6587 },
6588 GetNextCheckBoxValue: function(currentValue, allowGrayed) {
6589  var currentInputKey = this.GetInputKeyByValue(currentValue);
6590  var nextInputKey = '';
6591  switch(currentInputKey) {
6592   case CheckBoxInputKey.Checked:
6593    nextInputKey = CheckBoxInputKey.Unchecked; break;
6594   case CheckBoxInputKey.Unchecked:
6595    nextInputKey = allowGrayed ? CheckBoxInputKey.Indeterminate : CheckBoxInputKey.Checked; break;
6596   case CheckBoxInputKey.Indeterminate:
6597    nextInputKey = CheckBoxInputKey.Checked; break;
6598  }
6599  return this.GetValueByInputKey(nextInputKey);
6600 },
6601 GetCheckStateByInputKey: function(inputKey) {
6602  switch(inputKey) {
6603   case CheckBoxInputKey.Checked: 
6604    return CheckBoxCheckState.Checked;
6605   case CheckBoxInputKey.Unchecked: 
6606    return CheckBoxCheckState.Unchecked;
6607   case CheckBoxInputKey.Indeterminate: 
6608    return CheckBoxCheckState.Indeterminate;
6609  }
6610 },
6611 GetValueByCheckState: function(checkState) {
6612  switch(checkState) {
6613   case CheckBoxCheckState.Checked: 
6614    return this.GetValueByInputKey(CheckBoxInputKey.Checked);
6615   case CheckBoxCheckState.Unchecked: 
6616    return this.GetValueByInputKey(CheckBoxInputKey.Unchecked);
6617   case CheckBoxCheckState.Indeterminate: 
6618    return this.GetValueByInputKey(CheckBoxInputKey.Indeterminate);
6619  }
6620 },
6621 GetFirstValueBySecondValue: function(firstValueName, secondValueName, secondValue) {
6622  return this.GetValueByFunc(firstValueName, 
6623   function(checkBoxState) { return checkBoxState[secondValueName] === secondValue; });
6624 },
6625 GetValueByFunc: function(valueName, func) {
6626  for(var i = 0; i < this.checkBoxStates.length; i++) {
6627   if(func(this.checkBoxStates[i]))
6628    return this.checkBoxStates[i][valueName];
6629  }  
6630 },
6631 AssignElementClassName: function(element, cssClassPropertyKey, disabledCssClassPropertyKey, assignedClassName) {
6632  var classNames = [ ];
6633  for(var i = 0; i < this.imageProperties[cssClassPropertyKey].length; i++) {
6634   classNames.push(this.imageProperties[disabledCssClassPropertyKey][i]);
6635   classNames.push(this.imageProperties[cssClassPropertyKey][i]);
6636  }
6637  var elementClassName = element.className;
6638  for(var i = 0; i < classNames.length; i++) {
6639   var className = classNames[i];
6640   var index = elementClassName.indexOf(className);
6641   if(index > -1)
6642    elementClassName = elementClassName.replace((index == 0 ? '' : ' ') + className, "");
6643  }
6644  elementClassName += " " + assignedClassName;
6645  element.className = elementClassName;
6646 },
6647 UpdateInternalCheckBoxDecoration: function(mainElement, inputKey, enabled) {
6648  var imagePropertiesNumber = this.GetImagePropertiesNumByInputKey(inputKey);
6649  for(var imagePropertyKey in this.imageProperties) {
6650   var propertyValue = this.imageProperties[imagePropertyKey][imagePropertiesNumber];
6651   propertyValue = propertyValue || !isNaN(propertyValue) ? propertyValue : "";
6652   switch(imagePropertyKey) {
6653    case "0" : mainElement.title = propertyValue; break;
6654    case "1" : mainElement.style.width = propertyValue + (propertyValue != "" ? "px" : ""); break;
6655    case "2" : mainElement.style.height = propertyValue + (propertyValue != "" ? "px" : ""); break;
6656   }
6657   if(enabled) {
6658    switch(imagePropertyKey) {
6659     case "3" : this.SetImageSrc(mainElement, propertyValue); break;
6660     case "4" : 
6661      this.AssignElementClassName(mainElement, "4", "8", propertyValue);
6662      break;
6663     case "5" : this.SetBackgroundPosition(mainElement, propertyValue, true); break;
6664     case "6" : this.SetBackgroundPosition(mainElement, propertyValue, false); break;
6665    }
6666   } else {
6667     switch(imagePropertyKey) {
6668     case "7" : this.SetImageSrc(mainElement, propertyValue); break;
6669     case "8" : 
6670      this.AssignElementClassName(mainElement, "4", "8", propertyValue);
6671      break;
6672     case "9" : this.SetBackgroundPosition(mainElement, propertyValue, true); break;
6673     case "10" : this.SetBackgroundPosition(mainElement, propertyValue, false); break;
6674    }
6675   }
6676  }
6677 },
6678 SetImageSrc: function(mainElement, src) {
6679  if(src === ""){
6680   mainElement.style.backgroundImage = "";
6681   mainElement.style.backgroundPosition = "";
6682  }
6683  else{
6684   mainElement.style.backgroundImage = "url('" + src + "')";
6685   this.SetBackgroundPosition(mainElement, 0, true);
6686   this.SetBackgroundPosition(mainElement, 0, false);
6687  }
6688 },
6689 SetBackgroundPosition: function(element, value, isX) {
6690  if(value === "") {
6691   element.style.backgroundPosition = value;
6692   return;
6693  }
6694  if(element.style.backgroundPosition === "")
6695   element.style.backgroundPosition = isX ? "-" + value.toString() + "px 0px" : "0px -" + value.toString() + "px";
6696  else {
6697   var position = element.style.backgroundPosition.split(' ');
6698   element.style.backgroundPosition = isX ? '-' + value.toString() + "px " + position[1] :  position[0] + " -" + value.toString() + "px";
6699  }
6700 },
6701 AddState: function(value, stateInputKey, imagePropertiesNumber) {
6702  this.checkBoxStates.push({
6703   "Value" : value, 
6704   "StateInputKey" : stateInputKey, 
6705   "ImagePropertiesNumber" : imagePropertiesNumber
6706  });
6707 },
6708 GetAriaCheckedValue: function(state) {
6709  switch(state) {
6710   case ASPx.CheckBoxCheckState.Checked: return "true";
6711   case ASPx.CheckBoxCheckState.Unchecked: return "false";
6712   case ASPx.CheckBoxCheckState.Indeterminate: return "mixed";
6713   default: return "";
6714  }
6715 }
6716});
6717CheckableElementStateController.Create = function(imageProperties, valueChecked, valueUnchecked, valueGrayed, allowGrayed) {
6718 var stateController = new CheckableElementStateController(imageProperties);
6719 stateController.AddState(valueChecked, CheckBoxInputKey.Checked, 0);
6720 stateController.AddState(valueUnchecked, CheckBoxInputKey.Unchecked, 1);
6721 if(typeof(valueGrayed) != "undefined")
6722  stateController.AddState(valueGrayed, CheckBoxInputKey.Indeterminate, allowGrayed ? 2 : 1);
6723 stateController.allowGrayed = allowGrayed;
6724 return stateController;
6725};
6726var CheckableElementHelper = ASPx.CreateClass(null, {
6727 InternalCheckBoxInitialize: function(internalCheckBox) {
6728  this.AttachToMainElement(internalCheckBox);
6729  this.AttachToInputElement(internalCheckBox);
6730 },
6731 AttachToMainElement: function(internalCheckBox) {
6732  var instance = this;
6733  if(internalCheckBox.mainElement) {
6734    ASPx.Evt.AttachEventToElement(internalCheckBox.mainElement, "click",
6735    function (evt) { 
6736     instance.InvokeClick(internalCheckBox, evt);
6737     if(!internalCheckBox.disableCancelBubble)
6738      return ASPx.Evt.PreventEventAndBubble(evt);
6739    }
6740   );
6741   ASPx.Evt.AttachEventToElement(internalCheckBox.mainElement, "mousedown",
6742    function (evt) {
6743     internalCheckBox.Refocus();
6744    }
6745   );
6746   ASPx.Evt.PreventElementDragAndSelect(internalCheckBox.mainElement, true);
6747  }
6748 },
6749 AttachToInputElement: function(internalCheckBox) {
6750  var instance = this;
6751  if(internalCheckBox.inputElement && internalCheckBox.mainElement) {
6752   var checkableElement = internalCheckBox.accessibilityCompliant ? internalCheckBox.mainElement : internalCheckBox.inputElement;
6753   ASPx.Evt.AttachEventToElement(checkableElement, "focus",
6754    function (evt) { 
6755     if(!internalCheckBox.enabled)
6756      checkableElement.blur();
6757     else
6758      internalCheckBox.OnFocus();
6759    }
6760   );
6761   ASPx.Evt.AttachEventToElement(checkableElement, "blur", 
6762    function (evt) { 
6763     internalCheckBox.OnLostFocus();
6764    }
6765   );
6766   ASPx.Evt.AttachEventToElement(checkableElement, "keyup",
6767    function (evt) { 
6768     if(ASPx.Evt.GetKeyCode(evt) == ASPx.Key.Space)
6769      instance.InvokeClick(internalCheckBox, evt);
6770    }
6771   );
6772   ASPx.Evt.AttachEventToElement(checkableElement, "keydown",
6773    function (evt) { 
6774     if(ASPx.Evt.GetKeyCode(evt) == ASPx.Key.Space)
6775      return ASPx.Evt.PreventEvent(evt);
6776    }
6777   );
6778  }
6779 },
6780 IsKBSInputWrapperExist: function() {
6781  return ASPx.Browser.Opera || ASPx.Browser.WebKitFamily;
6782 },
6783 GetICBMainElementByInput: function(icbInputElement) {
6784  return this.IsKBSInputWrapperExist() ? icbInputElement.parentNode.parentNode : icbInputElement.parentNode;
6785 },
6786 InvokeClick: function(internalCheckBox, evt) {
6787   if(internalCheckBox.enabled && !internalCheckBox.readOnly) {
6788   var inputElementValue = internalCheckBox.inputElement.value;
6789   var focusableElement = internalCheckBox.accessibilityCompliant ? internalCheckBox.mainElement : internalCheckBox.inputElement; 
6790   focusableElement.focus();
6791   if(!ASPx.Browser.IE) 
6792    internalCheckBox.inputElement.value = inputElementValue;
6793   this.InvokeClickCore(internalCheckBox, evt)
6794   }
6795 },
6796 InvokeClickCore: function(internalCheckBox, evt) {
6797  internalCheckBox.OnClick(evt);
6798 }
6799});
6800CheckableElementHelper.Instance = new CheckableElementHelper();
6801var CheckBoxInternal = ASPx.CreateClass(null, {
6802 constructor: function(inputElement, stateController, allowGrayed, allowGrayedByClick, helper, container, storeValueInInput, key, disableCancelBubble,
6803  accessibilityCompliant) {
6804  this.inputElement = inputElement;
6805  this.mainElement = helper.GetICBMainElementByInput(this.inputElement);
6806  this.name = (key ? key : this.inputElement.id) + CheckBoxInternal.GetICBMainElementPostfix();
6807  this.mainElement.id = this.name;
6808  this.stateController = stateController;
6809  this.container = container;
6810  this.allowGrayed = allowGrayed;
6811  this.allowGrayedByClick = allowGrayedByClick;
6812  this.autoSwitchEnabled = true;
6813  this.storeValueInInput = !!storeValueInInput;
6814  this.storedInputKey = !this.storeValueInInput ? this.inputElement.value : null;
6815  this.disableCancelBubble = !!disableCancelBubble;
6816  this.accessibilityCompliant = accessibilityCompliant;
6817  this.focusDecoration = null;
6818  this.focused = false;
6819  this.focusLocked = false;
6820  this.enabled = !this.mainElement.className.match(/dxWeb_\w+Disabled(\b|_)/);
6821  this.readOnly = false;
6822  this.CheckedChanged = new ASPxClientEvent();
6823  this.Focus = new ASPxClientEvent();
6824  this.LostFocus = new ASPxClientEvent();
6825  helper.InternalCheckBoxInitialize(this);
6826 },
6827 ChangeInputElementTabIndex: function() {  
6828  var changeMethod = this.enabled ? ASPx.Attr.RestoreTabIndexAttribute : ASPx.Attr.SaveTabIndexAttributeAndReset;
6829  changeMethod(this.inputElement);
6830 },
6831 CreateFocusDecoration: function(focusedStyle) {
6832   this.focusDecoration = new EditorStyleDecoration(this);
6833   this.focusDecoration.AddStyle('F', focusedStyle[0], focusedStyle[1]);
6834   this.focusDecoration.AddPostfix("");
6835 },
6836 UpdateFocusDecoration: function() {
6837  this.focusDecoration.Update();
6838 },  
6839 StoreInputKey: function(inputKey) {
6840  if(this.storeValueInInput)
6841   this.inputElement.value = inputKey;
6842  else
6843   this.storedInputKey = inputKey;
6844 },
6845 GetStoredInputKey: function() {
6846  if(this.storeValueInInput)
6847   return this.inputElement.value;
6848  else
6849   return this.storedInputKey;
6850 },
6851 OnClick: function(e) {
6852  if(this.autoSwitchEnabled) {
6853   var currentValue = this.GetValue();
6854   var value = this.stateController.GetNextCheckBoxValue(currentValue, this.allowGrayedByClick && this.allowGrayed);
6855   this.SetValue(value);
6856  }
6857  this.CheckedChanged.FireEvent(this, e);
6858 },
6859 OnFocus: function() {
6860  if(!this.IsFocusLocked()) {
6861   this.focused = true;
6862   this.UpdateFocusDecoration();
6863   this.Focus.FireEvent(this, null);
6864  } else
6865   this.UnlockFocus();
6866 },
6867 OnLostFocus: function() {
6868  if(!this.IsFocusLocked()) {
6869   this.focused = false;
6870   this.UpdateFocusDecoration();
6871   this.LostFocus.FireEvent(this, null);
6872  }
6873 },
6874 Refocus: function() {
6875  if(this.focused) {
6876   this.LockFocus();
6877   this.inputElement.blur();
6878   if(ASPx.Browser.MacOSMobilePlatform) {
6879    window.setTimeout(function() {
6880     ASPx.SetFocus(this.inputElement);
6881    }, 100);
6882   } else {
6883    ASPx.SetFocus(this.inputElement);
6884   }
6885  }
6886 },
6887 LockFocus: function() {
6888  this.focusLocked = true;
6889 },
6890 UnlockFocus: function() {
6891  this.focusLocked = false;
6892 },
6893 IsFocusLocked: function() {
6894  if(!!ASPx.Attr.GetAttribute(this.mainElement, ASPx.Attr.GetTabIndexAttributeName()))
6895   return false;
6896  return this.focusLocked;
6897 },
6898 SetValue: function(value) {
6899  var currentValue = this.GetValue();
6900  if(currentValue !== value) {
6901   var newInputKey = this.stateController.GetInputKeyByValue(value);
6902   if(newInputKey) {
6903    this.StoreInputKey(newInputKey);   
6904    this.stateController.UpdateInternalCheckBoxDecoration(this.mainElement, newInputKey, this.enabled);
6905   }
6906  }
6907  if(this.accessibilityCompliant) {
6908   var state = this.GetCurrentCheckState();
6909   var value = this.stateController.GetAriaCheckedValue(state);
6910   if(this.mainElement.attributes["aria-checked"] !== undefined)
6911    this.mainElement.setAttribute("aria-checked", value); 
6912   if(this.mainElement.attributes["aria-selected"] !== undefined)
6913    this.mainElement.setAttribute("aria-selected", value); 
6914  }
6915 },
6916 GetValue: function() {
6917  return this.stateController.GetValueByInputKey(this.GetCurrentInputKey());
6918 },
6919 GetCurrentCheckState: function() {
6920  return this.stateController.GetCheckStateByInputKey(this.GetCurrentInputKey());
6921 },
6922 GetCurrentInputKey: function() {
6923  return this.GetStoredInputKey();
6924 },
6925 GetChecked: function() {
6926  return this.GetCurrentInputKey() === CheckBoxInputKey.Checked;
6927 },
6928 SetChecked: function(checked) {
6929  var newValue = this.stateController.GetValueByCheckState(checked ? CheckBoxCheckState.Checked : CheckBoxCheckState.Unchecked);
6930  this.SetValue(newValue);
6931 },
6932 SetEnabled: function(enabled) {
6933  if(this.enabled != enabled) {
6934   this.enabled = enabled;
6935   this.stateController.UpdateInternalCheckBoxDecoration(this.mainElement, this.GetCurrentInputKey(), this.enabled);
6936   this.ChangeInputElementTabIndex();
6937  }
6938 },
6939 GetEnabled: function() {
6940  return this.enabled;
6941 }
6942});
6943CheckBoxInternal.GetICBMainElementPostfix = function() {
6944 return "_D";
6945};
6946var CheckBoxInternalCollection = ASPx.CreateClass(CollectionBase, {
6947 constructor: function(imageProperties, allowGrayed, storeValueInInput, helper, disableCancelBubble, accessibilityCompliant) {
6948  this.constructor.prototype.constructor.call(this);
6949  this.stateController = allowGrayed 
6950   ? CheckableElementStateController.Create(imageProperties, CheckBoxInputKey.Checked, CheckBoxInputKey.Unchecked, CheckBoxInputKey.Indeterminate, true)
6951   : CheckableElementStateController.Create(imageProperties, CheckBoxInputKey.Checked, CheckBoxInputKey.Unchecked);
6952  this.helper = helper || CheckableElementHelper.Instance;
6953  this.storeValueInInput = !!storeValueInInput;
6954  this.disableCancelBubble = !!disableCancelBubble;
6955  this.accessibilityCompliant = accessibilityCompliant;
6956 },
6957 Add: function(key, inputElement, container) {
6958  this.Remove(key);
6959  var checkBox = this.CreateInternalCheckBox(key, inputElement, container);
6960  CollectionBase.prototype.Add.call(this, key, checkBox);
6961  return checkBox;
6962 },
6963 SetImageProperties: function(imageProperties) {
6964  this.stateController.imageProperties = imageProperties;
6965 },
6966 CreateInternalCheckBox: function(key, inputElement, container) {
6967  return new CheckBoxInternal(inputElement, this.stateController, this.stateController.allowGrayed, false, this.helper, container, 
6968   this.storeValueInInput, key, this.disableCancelBubble, this.accessibilityCompliant);
6969 }
6970});
6971var EditorStyleDecoration = ASPx.CreateClass(null, {
6972 constructor: function(editor) {
6973  this.editor = editor;
6974  this.postfixList = [ ];
6975  this.styles = { };
6976  this.innerStyles = { };
6977  this.nullTextClassName = "";
6978  this.lockUpdate = false;
6979 },
6980 GetStyleSheet: function() {
6981  return ASPx.GetCurrentStyleSheet();
6982 },
6983 AddPostfix: function(value, applyClass, applyBorders, applyBackgroun
6983d) {
6984  this.postfixList.push(value);
6985 },
6986 AddStyle: function(key, className, cssText) {
6987  this.styles[key] = this.CreateRule(className, cssText);
6988  this.innerStyles[key] = this.CreateRule("", this.FilterInnerCss(cssText));
6989 },
6990 CreateRule: function(className, cssText) {
6991  return ASPx.Str.Trim(className + " " + ASPx.CreateImportantStyleRule(this.GetStyleSheet(), cssText));
6992 },
6993 GetElementByPostfix: function(postfix) {
6994  return ASPx.GetElementById(this.editor.name + postfix);
6995 },
6996 LockUpdate: function() {
6997  this.lockUpdate = true;
6998 },
6999 UnlockUpdate: function() {
7000  this.lockUpdate = false;
7001 },
7002 IsUpdateLocked: function() {
7003  return this.lockUpdate;
7004 },
7005 Update: function() {
7006  if(this.IsUpdateLocked())
7007   return;
7008  this.UpdateCore();
7009 },
7010 UpdateCore: function() {
7011  for(var i = 0; i < this.postfixList.length; i++) {
7012   var postfix = this.postfixList[i];
7013   var inner = postfix.length > 0;
7014   var element = this.GetElementByPostfix(postfix);
7015   if(element) {
7016    this.ApplyInvalidStyle(element, inner);
7017    this.ApplyFocusedStyle(element, inner);
7018    this.ApplyNullTextStyle(element, inner);
7019   }
7020  }
7021 },
7022 ApplyInvalidStyle: function(element, inner) {
7023  if(this.HasDecoration("I")) {
7024   var isValid = this.editor.GetIsValid();
7025   this.ApplyDecoration("I", element, inner, !isValid);
7026  }
7027 },
7028 ApplyFocusedStyle: function(element, inner) {
7029  if(this.HasDecoration("F"))
7030   this.ApplyDecoration("F", element, inner, this.editor.focused);
7031 },
7032 ApplyNullTextStyle: function(element, inner) {
7033  if(!this.HasDecoration("N"))
7034   return;  
7035  var apply = !this.editor.focused;
7036  if(apply) {
7037   if(this.editor.CanApplyNullTextDecoration) {
7038    apply = this.editor.CanApplyNullTextDecoration();
7039   } else {
7040    var value = this.editor.GetValue();
7041    apply = apply && (value == null || value === "");
7042   }
7043  }
7044  if(apply)
7045   ASPx.Attr.ChangeAttribute(element, "spellcheck", "false");
7046  else
7047   ASPx.Attr.RestoreAttribute(element, "spellcheck");
7048  this.ApplyDecoration("N", element, inner, apply);
7049 },
7050 HasDecoration: function(key) {
7051  return !!this.styles[key];
7052 },
7053 ApplyNullTextClassName: function(active) {
7054  var nullTextClassName = this.GetNullTextClassName();
7055  var editorMainElement = this.editor.GetMainElement();
7056  if (active)
7057   ASPx.AddClassNameToElement(editorMainElement, nullTextClassName);
7058  else
7059   ASPx.RemoveClassNameFromElement(editorMainElement, nullTextClassName);
7060 },
7061 GetNullTextClassName: function () {
7062  if (!this.nullTextClassName)
7063   this.InitializeNullTextClassName();
7064  return this.nullTextClassName;
7065 },
7066 InitializeNullTextClassName: function () {
7067  var nullTextStyle = this.styles["N"];
7068  if (nullTextStyle) {
7069   var nullTextStyleClassNames = nullTextStyle.split(" ");
7070   for (var i = 0; i < nullTextStyleClassNames.length; i++)
7071    if (nullTextStyleClassNames[i].match("dxeNullText"))
7072     this.nullTextClassName = nullTextStyleClassNames[i];
7073  }
7074 },
7075 ApplyDecoration: function(key, element, inner, active) {
7076  var value = inner ? this.innerStyles[key] : this.styles[key];
7077  ASPx.RemoveClassNameFromElement(element, value);
7078  if(ASPx.Browser.IE && ASPx.Browser.MajorVersion >= 11)
7079   var reflow = element.offsetWidth; 
7080  if(active) {
7081   ASPx.AddClassNameToElement(element, value);
7082   if(ASPx.Browser.IE && ASPx.Browser.Version > 10 && element.border != null) { 
7083    var border = parseInt(element.border) || 0;
7084    element.border = 1;
7085    element.border = border;
7086   }
7087  }
7088 },
7089 FilterInnerCss: function(css) {
7090  return css.replace(/(border|background-image)[^:]*:[^;]+/gi, "");
7091 }
7092});
7093var TouchUIHelper = {
7094 isGesture: false,
7095 isMouseEventFromScrolling: false,
7096 isNativeScrollingAllowed: true,
7097 clickSensetivity: 10,
7098 documentTouchHandlers: {},
7099 documentEventAttachingAllowed: true,
7100 msTouchDraggableClassName: "dxMSTouchDraggable",
7101 touchMouseDownEventName: ASPx.Browser.WebKitTouchUI ? "touchstart" : (ASPx.Browser.Edge && ASPx.Browser.MSTouchUI && window.PointerEvent ? "pointerdown" : "mousedown"),
7102 touchMouseUpEventName:   ASPx.Browser.WebKitTouchUI ? "touchend"   : (ASPx.Browser.Edge && ASPx.Browser.MSTouchUI && window.PointerEvent ? "pointerup" : "mouseup"),
7103 touchMouseMoveEventName: ASPx.Browser.WebKitTouchUI ? "touchmove"  : (ASPx.Browser.Edge && ASPx.Browser.MSTouchUI && window.PointerEvent ? "pointermove" : "mousemove"),
7104 isTouchEvent: function(evt) {
7105  if(!evt) return false;
7106  return ASPx.Browser.WebKitTouchUI && ASPx.IsExists(evt.changedTouches); 
7107 },
7108 isTouchEventName: function(eventName) {
7109  return ASPx.Browser.WebKitTouchUI && (eventName.indexOf("touch") > -1 || eventName.indexOf("gesture") > -1);
7110 },
7111 getEventX: function(evt) { 
7112  return ASPx.Browser.IE ? evt.pageX : evt.changedTouches[0].pageX; 
7113 },
7114 getEventY: function (evt) { 
7115  return ASPx.Browser.IE ? evt.pageY :evt.changedTouches[0].pageY; 
7116 },
7117 getWebkitMajorVersion: function(){
7118  if(!this.webkitMajorVersion){
7119   var regExp = new RegExp("applewebkit/(\\d+)", "i");
7120   var matches = regExp.exec(ASPx.Browser.UserAgent);
7121   if(matches && matches.index >= 1)
7122    this.webkitMajorVersion = matches[1];
7123  }
7124  return this.webkitMajorVersion;
7125 },
7126 getIsLandscapeOrientation: function(){
7127  if(ASPx.Browser.MacOSMobilePlatform || ASPx.Browser.AndroidMobilePlatform)
7128   return Math.abs(window.orientation) == 90;
7129  return ASPx.GetDocumentClientWidth() > ASPx.GetDocumentClientHeight();
7130 },
7131 nativeScrollingSupported: function() {
7132  var allowedSafariVersion = ASPx.Browser.Version >= 5.1 && ASPx.Browser.Version < 8; 
7133  var allowedWebKitVersion = this.getWebkitMajorVersion() >
7133 533 && (ASPx.Browser.Chrome || this.getWebkitMajorVersion() < 600);
7134  return (ASPx.Browser.MacOSMobilePlatform && (allowedSafariVersion || allowedWebKitVersion))
7135   || (ASPx.Browser.AndroidMobilePlatform && ASPx.Browser.PlaformMajorVersion >= 3) || (ASPx.Browser.MSTouchUI && (!ASPx.Browser.WindowsPhonePlatform || !ASPx.Browser.IE));
7136 },
7137 makeScrollableIfRequired: function(element, options) {
7138  if(ASPx.Browser.WebKitTouchUI && element) {
7139   var overflow = ASPx.GetCurrentStyle(element).overflow;
7140   if(element.tagName == "DIV" &&  overflow != "hidden" && overflow != "visible" ){
7141    return this.MakeScrollable(element);
7142   }
7143  }
7144 },
7145 preventScrollOnEvent: function(evt){
7146 },
7147 handleFastTapIfRequired: function(evt, action, preventCommonClickEvents) {
7148  if(ASPx.Browser.WebKitTouchUI && evt.type == 'touchstart' && action) {
7149   this.FastTapHelper.HandleFastTap(evt, action, preventCommonClickEvents);
7150   return true;
7151  }
7152  return false;
7153 },
7154 ensureDocumentSizesCorrect: function (){
7155  return (document.documentElement.clientWidth - document.documentElement.clientHeight) / (screen.width - screen.height) > 0;
7156 },
7157 ensureOrientationChanged: function(onOrientationChangedFunction){
7158  if(ASPxClientUtils.iOSPlatform || this.ensureDocumentSizesCorrect())
7159   onOrientationChangedFunction();
7160  else {
7161   window.setTimeout(function(){
7162    this.ensureOrientationChanged(onOrientationChangedFunction);
7163   }.aspxBind(this), 100);
7164  }
7165 },
7166 onEventAttachingToDocument: function(eventName, func){
7167  if(ASPx.Browser.MacOSMobilePlatform && this.isTouchEventName(eventName)) {
7168   if(!this.documentTouchHandlers[eventName])
7169    this.documentTouchHandlers[eventName] = [];
7170   this.documentTouchHandlers[eventName].push(func);
7171   return this.documentEventAttachingAllowed;
7172  }
7173  return true;
7174 },
7175 onEventDettachedFromDocument: function(eventName, func){
7176  if(ASPx.Browser.MacOSMobilePlatform && this.isTouchEventName(eventName)) {
7177   var handlers = this.documentTouchHandlers[eventName];
7178   if(handlers)
7179    ASPx.Data.ArrayRemove(handlers, func);
7180  }
7181 },
7182 processDocumentTouchEventHandlers: function(proc) {
7183  var touchEventNames = ["touchstart", "touchend", "touchmove", "gesturestart", "gestureend"];
7184  for(var i = 0; i < touchEventNames.length; i++) {
7185   var eventName = touchEventNames[i];
7186   var handlers = this.documentTouchHandlers[eventName];
7187   if(handlers) {
7188    for(var j = 0; j < handlers.length; j++) {
7189     proc(eventName,handlers[j]);
7190    }
7191   }
7192  }
7193 },
7194 removeDocumentTouchEventHandlers: function() {
7195  if(ASPx.Browser.MacOSMobilePlatform) {
7196   this.documentEventAttachingAllowed = false;
7197   this.processDocumentTouchEventHandlers(ASPx.Evt.DetachEventFromDocumentCore);
7198  }
7199 },
7200 restoreDocumentTouchEventHandlers: function () {
7201  if(ASPx.Browser.MacOSMobilePlatform) {
7202   this.documentEventAttachingAllowed = true;
7203   this.processDocumentTouchEventHandlers(ASPx.Evt.AttachEventToDocumentCore);
7204  }
7205 },
7206 IsNativeScrolling: function() {
7207  return TouchUIHelper.nativeScrollingSupported() && TouchUIHelper.isNativeScrollingAllowed;
7208 },
7209 pointerEnabled: !!(window.PointerEvent || window.MSPointerEvent),
7210 pointerDownEventName: window.PointerEvent ? "pointerdown" : "MSPointerDown",
7211 pointerUpEventName: window.PointerEvent ? "pointerup" : "MSPointerUp",
7212 pointerCancelEventName: window.PointerEvent ? "pointercancel" : "MSPointerCancel",
7213 pointerMoveEventName: window.PointerEvent ? "pointermove" : "MSPointerMove",
7214 pointerOverEventName: window.PointerEvent ? "pointerover" : "MSPointerOver",
7215 pointerOutEventName: window.PointerEvent ? "pointerout" : "MSPointerOut",
7216 pointerType: {
7217  Touch: (ASPx.Browser.IE && ASPx.Browser.Version == 10) ? 2 : "touch",
7218  Pen: (ASPx.Browser.IE && ASPx.Browser.Version == 10) ? 3 : "pen",
7219  Mouse: (ASPx.Browser.IE && ASPx.Browser.Version == 10) ? 4 : "mouse"
7220 },
7221 msGestureEnabled: !!(window.PointerEvent || window.MSPointerEvent) && typeof(MSGesture) != "undefined",
7222 msTouchCreateGesturesWrapper: function(element, onTap){
7223  if(!TouchUIHelper.msGestureEnabled) 
7224   return;
7225  var gesture = new MSGesture();
7226  gesture.target = element;
7227  ASPx.Evt.AttachEventToElement(element, TouchUIHelper.pointerDownEventName, function(evt){
7228   gesture.addPointer(evt.pointerId);
7229  });
7230  ASPx.Evt.AttachEventToElement(element, TouchUIHelper.pointerUpEventName, function(evt){
7231   gesture.stop();
7232  });
7233  if(onTap)
7234   ASPx.Evt.AttachEventToElement(element, "MSGestureTap", onTap);
7235  return gesture;
7236 }
7237};
7238var CacheHelper = {};
7239CacheHelper.GetCachedValueCore = function(obj, key, func, cacheObj, fillValueMethod) {
7240 if(!cacheObj)
7241  cacheObj = obj;
7242 if(!cacheObj.cache)
7243  cacheObj.cache = {};
7244 if(!key) 
7245  key = "default";
7246 fillValueMethod(obj, key, func, cacheObj);
7247 return cacheObj.cache[key];
7248};
7249CacheHelper.GetCachedValue = function(obj, key, func, cacheObj) {
7250 return CacheHelper.GetCachedValueCore(obj, key, func, cacheObj, 
7251  function(obj, key, func, cacheObj) {
7252   if(!ASPx.IsExists(cacheObj.cache[key]))
7253    cacheObj.cache[key] = func.apply(obj, []);
7254  });
7255};
7256CacheHelper.GetCachedElement = function(obj, key, func, cacheObj) {
7257 return CacheHelper.GetCachedValueCore(obj, key, func, cacheObj, 
7258  function(obj, key, func, cacheObj) {
7259   if(!ASPx.IsValidElement(cacheObj.cache[key]))
7260    cacheObj.cache[key] = func.apply(obj, []);
7261  });
7262};
7263CacheHelper.GetCachedElements = function(obj, key, func, cacheObj) {
7264 return CacheHelper.GetCachedValueCore(obj, key, func, cacheObj, 
7265  function(obj, key, func, cacheObj) {
7266   if(!ASPx.IsValidElements(cacheObj.cache[key])){
7267    var elements = func.apply(obj, []);
7268    if(!Ident.IsArray(elements))
7269     elements = [elements];
7270    cacheObj.cache[key] = elements;
7271   }
7272  });
7273};
7274CacheHelper.GetCachedElementById = function(obj, id, cacheObj) {
7275 return CacheHelper.GetCachedElement(obj, id, function() { return ASPx.GetElementById(id); }, cacheObj);
7276};
7277CacheHelper.GetCachedChildById = function(obj, parent, id, cacheObj) {
7278 return CacheHelper.GetCachedElement(obj, id, function() { return ASPx.GetChildById(parent, id); }, cacheObj);
7279};
7280CacheHelper.DropCachedValue = function(cacheObj, key) {
7281 cacheObj.cache[key] = null;
7282};  
7283CacheHelper.DropCache = function(cacheObj) {
7284 cacheObj.cache = null;
7285};  
7286var DomObserver = ASPx.CreateClass(null, {
7287 constructor: function() {
7288  this.items = { };
7289 },
7290 subscribe: function(elementID, callbackFunc) {
7291  var item = this.items[elementID];
7292  if(item)
7293   this.unsubscribe(elementID);
7294  item = {
7295   elementID: elementID,
7296   callbackFunc: callbackFunc,
7297   pauseCount: 0
7298  };
7299  this.prepareItem(item);
7300  this.items[elementID] = item;
7301 },
7302 prepareItem: function(item) {
7303 },
7304 unsubscribe: function(elementID) {
7305  this.items[elementID] = null;
7306 },
7307 getItemElement: function(item) {
7308  var element = this.getElementById(item.elementID);
7309  if(element)
7310   return element;
7311  this.unsubscribe(item.elementID);
7312  return null;
7313 },
7314 getElementById: function(elementID) {
7315  var element = document.getElementById(elementID);
7316  return element && ASPx.IsValidElement(element) ? element : null;
7317 },
7318 pause: function(element, includeSubtree) {
7319  this.changeItemsState(element, includeSubtree, true);
7320 },
7321 resume: function(element, includeSubtree) {
7322  this.changeItemsState(element, includeSubtree, false);
7323 },
7324 forEachItem: function(processFunc, context) {
7325  context = context || this;
7326  for(var itemName in this.items) {
7327   if(!this.items.hasOwnProperty(itemName))
7328    continue;
7329   var item = this.items[itemName];
7330   if(item) {
7331    var needBreak = processFunc.call(context, item);
7332    if(needBreak)
7333     return;
7334   }
7335  }
7336 },
7337 changeItemsState: function(element, includeSubtree, pause) {
7338  this.forEachItem(function(item) {
7339   if(!element)
7340    this.changeItemState(item, pause);
7341   else {
7342    var itemElement = this.getItemElement(item);
7343    if(itemElement && (element == itemElement || (includeSubtree && ASPx.GetIsParent(element, itemElement)))) {
7344     this.changeItemState(item, pause);
7345     if(!includeSubtree)
7346      return true;
7347    }
7348   }
7349  }.aspxBind(this));
7350 },
7351 changeItemState: function(item, pause) {
7352  if(pause)
7353   this.pauseItem(item)
7354  else
7355   this.resumeItem(item);
7356 },
7357 pauseItem: function(item) {
7358  item.paused = true;
7359  item.pauseCount++;
7360 },
7361 resumeItem: function(item) {
7362  if(item.pauseCount > 0) {
7363   if(item.pauseCount == 1)
7364    item.paused = false;
7365   item.pauseCount--;
7366  }
7367 }
7368});
7369DomObserver.IsMutationObserverAvailable = function() {
7370 return !!window.MutationObserver;
7371};
7372var TimerObserver = ASPx.CreateClass(DomObserver, {
7373 constructor: function() {
7374  this.constructor.prototype.constructor.call(this);
7375  this.timerID = -1;
7376  this.observationTimeout = 300;
7377 },
7378 subscribe: function(elementID, callbackFunc) {
7379  DomObserver.prototype.subscribe.call(this, elementID, callbackFunc);
7380  if(!this.isActivated())
7381   this.startObserving();
7382 },
7383 isActivated: function() {
7384  return this.timerID !== -1;
7385 },
7386 startObserving: function() {
7387  if(this.isActivated())
7388   window.clearTimeout(this.timerID);
7389  this.timerID = window.setTimeout(this.onTimeout, this.observationTimeout);
7390 },
7391 onTimeout: function() {
7392  var observer = _aspxGetDomObserver();
7393  observer.doObserve();
7394  observer.startObserving();
7395 },
7396 doObserve: function() {
7397  if(!ASPx.documentLoaded) return;
7398  this.forEachItem(function(item) {
7399   if(!item.paused)
7400    this.doObserveForItem(item);
7401  }.aspxBind(this));
7402 },
7403 doObserveForItem: function(item) {
7404  var element = this.getItemElement(item);
7405  if(element)
7406   item.callbackFunc.call(this, element);
7407 }
7408});
7409var MutationObserver = ASPx.CreateClass(DomObserver, {
7410 constructor: function() {
7411  this.constructor.prototype.constructor.call(this);
7412  this.callbackTimeout = 10;
7413 },
7414 prepareItem: function(item) {
7415  item.callbackTimerID = -1;
7416  var target = this.getElementById(item.elementID);
7417  if(!target)
7418   return;
7419  var observerCallbackFunc = function() {
7420   if(item.callbackTimerID === -1) {
7421    var timeoutHander = function() {
7422     item.callbackTimerID = -1;
7423     item.callbackFunc.call(this, target);
7424    }.aspxBind(this);
7425    item.callbackTimerID = window.setTimeout(timeoutHander, this.callbackTimeout);
7426   }
7427  }.aspxBind(this);
7428  var observer = new window.MutationObserver(observerCallbackFunc);
7429  var config = { attributes: true, childList: true, characterData: true, subtree: true };
7430  observer.observe(target, config);
7431  item.observer = observer;
7432  item.config = config;
7433 },
7434 unsubscribe: function(elementID) {
7435  var item = this.items[elementID];
7436  if(item) {
7437   item.observer.disconnect();
7438   item.observer = null;
7439  }
7440  DomObserver.prototype.unsubscribe.call(this, elementID);
7441 },
7442 pauseItem: function(item) {
7443  DomObserver.prototype.pauseItem.call(this, item);
7444  item.observer.disconnect();
7445 },
7446 resumeItem: function(item) {
7447  DomObserver.prototype.resumeItem.call(this, item);
7448  if(!item.paused) {
7449   var target = this.getItemElement(item);
7450   if(target)
7451    item.observer.observe(target, item.config);
7452  }
7453 }
7454});
7455var domObserver = null;
7456function _aspxGetDomObserver() {
7457 if(domObserver == null)
7458  domObserver = DomObserver.IsMutationObserverAvailable() ? new MutationObserver() : new TimerObserver();
7459 return domObserver;
7460};
7461var ControlUpdateWatcher = ASPx.CreateClass(null, {
7462 constructor: function() {
7463  this.helpers = { };
7464  this.clearLockerTimerID = -1;
7465  this.clearLockerTimerDelay = 15;
7466  this.postProcessing = false;
7467  this.init();
7468 },
7469 init: function() {
7470  var postHandler = aspxGetPostHandler();
7471  postHandler.Post.AddHandler(this.OnPost, this);
7472 },
7473 Add: function(helper) {
7474  this.helpers[helper.GetName()] = helper;
7475 },
7476 CanSendCallback: function(dxCallbackOwner, arg) {
7477  this.LockConfirmOnBeforeWindowUnload();
7478  var modifiedHelpers = this.FilterModifiedHelpersByDXCallbackOwner(this.GetModifiedHelpers(), dxCallbackOwner, arg);
7479  if(modifiedHelpers.length === 0) return true;
7480  var modifiedHelpersInfo = this.GetToConfirmAndToResetLists(modifiedHelpers, dxCallbackOwner.name);
7481  if(!modifiedHelpersInfo) return true;
7482  if(modifiedHelpersInfo.toConfirm.length === 0) {
7483   this.ResetClientChanges(modifiedHelpersInfo.toReset);
7484   return true;
7485  }
7486  var helper = modifiedHelpersInfo.toConfirm[0];
7487  if(!confirm(helper.GetConfirmUpdateText()))
7488   return false;
7489  this.ResetClientChanges(modifiedHelpersInfo.toReset);
7490  return true;
7491 },
7492 OnPost: function(s, e) {
7493  if(e.isDXCallback) return;
7494  this.postProcessing = true;
7495  this.LockConfirmOnBeforeWindowUnload();
7496  var modifiedHelpersInfo = this.GetModifedHelpersInfo(e);
7497  if(!modifiedHelpersInfo) return;
7498  if(modifiedHelpersInfo.toConfirm.length === 0) {
7499   this.ResetClientChanges(modifiedHelpersInfo.toReset);
7500   return;
7501  }
7502  var helper = modifiedHelpersInfo.toConfirm[0];
7503  if(!confirm(helper.GetConfirmUpdateText())) {
7504   e.cancel = true;
7505   this.finishPostProcessing();
7506  }
7507  if(!e.cancel)
7508   this.ResetClientChanges(modifiedHelpersInfo.toReset);
7509 },
7510 finishPostProcessing: function() {
7511  this.postProcessing = false;
7512 },
7513 GetModifedHelpersInfo: function(e) {
7514  var modifiedHelpers = this.FilterModifiedHelpers(this.GetModifiedHelpers(), e);
7515  if(modifiedHelpers.length === 0) return;
7516  return this.GetToConfirmAndToResetLists(modifiedHelpers, e && e.ownerID);
7517 },
7518 GetToConfirmAndToResetLists: function(modifiedHelpers, ownerID) {
7519  var resetList = [ ];
7520  var confirmList = [ ];
7521  for(var i = 0; i < modifiedHelpers.length; i++) {
7522   var helper = modifiedHelpers[i];
7523   if(!helper.GetConfirmUpdateText()) { 
7524    resetList.push(helper);
7525    continue;
7526   }
7527   if(helper.CanShowConfirm(ownerID)) { 
7528    resetList.push(helper);
7529    confirmList.push(helper);
7530   }
7531  }
7532  return { toConfirm: confirmList, toReset: resetList };
7533 },
7534 FilterModifiedHelpers: function(modifiedHelpers, e) {
7535  if(modifiedHelpers.length === 0)
7536   return [ ];
7537  if(this.RequireProcessUpdatePanelCallback(e))
7538   return this.FilterModifiedHelpersByUpdatePanels(modifiedHelpers);
7539  if(this.postProcessing)
7540   return this.FilterModifiedHelpersByPostback(modifiedHelpers);
7541  return modifiedHelpers;
7542 },
7543 FilterModifiedHelpersByDXCallbackOwner: function(modifiedHelpers, dxCallbackOwner, arg) {
7544  var result = [ ];
7545  for(var i = 0; i < modifiedHelpers.length; i++) {
7546   var helper = modifiedHelpers[i];
7547   if(helper.NeedConfirmOnCallback(dxCallbackOwner, arg))
7548    result.push(helper);
7549  }
7550  return result;
7551 },
7552 FilterModifiedHelpersByUpdatePanels: function(modifiedHelpers) {
7553  var result = [ ];
7554  var updatePanels = this.GetUpdatePanelsWaitedForUpdate();
7555  for(var i = 0; i < updatePanels.length; i++) {
7556   var panelID = updatePanels[i].replace(/\$/g, "_");
7557   var panel = ASPx.GetElementById(panelID);
7558   if(!panel) continue;
7559   for(var j = 0; j < modifiedHelpers.length; j++) {
7560    var helper = modifiedHelpers[j];
7561    if(ASPx.GetIsParent(panel, helper.GetControlMainElement()))
7562     result.push(helper);
7563   }
7564  }
7565  return result;
7566 },
7567 FilterModifiedHelpersByPostback: function(modifiedHelpers) {
7568  var result = [ ];
7569  for(var i = 0; i < modifiedHelpers.length; i++) {
7570   var helper = modifiedHelpers[i];
7571   if(helper.NeedConfirmOnPostback())
7572    result.push(helper);
7573  }
7574  return result;
7575 },
7576 RequireProcessUpdatePanelCallback: function(e) {
7577  var rManager = this.GetMSRequestManager();
7578  if(rManager && e && e.isMSAjaxCallback)
7579   return rManager._postBackSettings.async;
7580  return false;
7581 },
7582 GetUpdatePanelsWaitedForUpdate: function() {
7583  var rManager = this.GetMSRequestManager();
7584  if(!rManager) return [ ];
7585  var panelUniqueIDs = rManager._postBackSettings.panelsToUpdate || [ ];
7586  var panelClientIDs = [ ];
7587  for(var i = 0; i < panelUniqueIDs.length; i++) {
7588   var index = ASPx.Data.ArrayIndexOf(rManager._updatePanelIDs, panelUniqueIDs[i]);
7589   if(index >= 0)
7590    panelClientIDs.push(rManager._updatePanelClientIDs[index]);
7591  }
7592  return panelClientIDs;
7593 },
7594 GetMSRequestManager: function() {
7595  if(window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager && Sys.WebForms.PageRequestManager.getInstance)
7596   return Sys.WebForms.PageRequestManager.getInstance();
7597  return null;
7598 },
7599 GetModifiedHelpers: function() {
7600  var result = [ ];
7601  for(var key in this.helpers) { 
7602   var helper = this.helpers[key];
7603   if(helper.HasChanges())
7604    result.push(helper);
7605  }
7606  return result;
7607 },
7608 ResetClientChanges: function(modifiedHelpers) {
7609  for(var i = 0; i < modifiedHelpers.length; i++)
7610   modifiedHelpers[i].ResetClientChanges();
7611 },
7612 GetConfirmUpdateMessage: function() {
7613  if(this.confirmOnWindowUnloadLocked) return;
7614  var modifiedHelpersInfo = this.GetModifedHelpersInfo();
7615  if(!modifiedHelpersInfo || modifiedHelpersInfo.toConfirm.length === 0) 
7616   return;
7617  var helper = modifiedHelpersInfo.toConfirm[0];
7618  return helper.GetConfirmUpdateText();
7619 },
7620 LockConfirmOnBeforeWindowUnload: function() {
7621  this.confirmOnWindowUnloadLocked = true;
7622  this.clearLockerTimerID = ASPx.Timer.ClearTimer(this.clearLockerTimerID);
7623  this.clearLockerTimerID = window.setTimeout(function() {
7624   this.confirmOnWindowUnloadLocked = false;
7625  }.aspxBind(this), this.clearLockerTimerDelay);
7626 },
7627 OnWindowBeforeUnload: function(e) {
7628  var confirmMessage = this.GetConfirmUpdateMessage();
7629  if(confirmMessage)
7630   e.returnValue = confirmMessage;
7631  this.finishPostProcessing();
7632  return confirmMessage;
7633 },
7634 OnWindowUnload: function(e) {
7635  if(this.confirmOnWindowUnloadLocked) return;
7636  var modifiedHelpersInfo = this.GetModifedHelpersInfo();
7637  if(!modifiedHelpersInfo) return;
7638  this.ResetClientChanges(modifiedHelpersInfo.toReset);
7639 },
7640 OnMouseDown: function(e) {
7641  if(ASPx.Browser.IE)
7642   this.PreventBeforeUnloadOnLinkClick(e);
7643 },
7644 OnFocusIn: function(e) {
7645  if(ASPx.Browser.IE)
7646   this.PreventBeforeUnloadOnLinkClick(e);
7647 },
7648 PreventBeforeUnloadOnLinkClick: function(e) {
7649  if(ASPx.GetObjectKeys(this.helpers).length == 0)
7650   return;
7651  var link = ASPx.GetParentByTagName(ASPx.Evt.GetEventSource(e), "A");
7652  if(!link || link.dxgvLinkClickHanlderAssigned)
7653   return;
7654  var url = ASPx.Attr.GetAttribute(link, "href");
7655  if(!url || url.indexOf("javascript:") < 0)
7656   return;
7657  ASPx.Evt.AttachEventToElement(link, "click", function(ev) { return ASPx.Evt.PreventEvent(ev); });
7658  link.dxgvLinkClickHanlderAssigned = true;
7659 }
7660});
7661ControlUpdateWatcher.Instance = null;
7662ControlUpdateWatcher.getInstance = function () {
7663 if (!ControlUpdateWatcher.Instance) {
7664  ControlUpdateWatcher.Instance = new ControlUpdateWatcher();
7665  ASPx.Evt.AttachEventToElement(window, "beforeunload", function(e) {
7666   return ControlUpdateWatcher.Instance.OnWindowBeforeUnload(e);
7667  });
7668  ASPx.Evt.AttachEventToElement(window, "unload", function(e) {
7669   ControlUpdateWatcher.Instance.OnWindowUnload(e);
7670  });
7671  ASPx.Evt.AttachEventToDocument("mousedown", function(e) {
7672   ControlUpdateWatcher.Instance.OnMouseDown(e);
7673  });
7674  ASPx.Evt.AttachEventToDocument("focusin", function(e) {
7675   ControlUpdateWatcher.Instance.OnFocusIn(e);
7676  });
7677 }
7678 return ControlUpdateWatcher.Instance;
7679};
7680var UpdateWatcherHelper = ASPx.CreateClass(null, {
7681 constructor: function(owner) {
7682  this.owner = owner;
7683  this.ownerWatcher = ControlUpdateWatcher.getInstance();
7684  this.ownerWatcher.Add(this);
7685 },
7686 GetName: function() {
7687  return this.owner.name;
7688 },
7689 GetControlMainElement: function() {
7690  return this.owner.GetMainElement();
7691 },
7692 GetControlParentForm: function(){
7693  return ASPx.GetParentByTagName(this.GetControlMainElement(), "FORM");
7694 },
7695 CanShowConfirm: function(requestOwnerID) {
7696  return true;
7697 },
7698 HasChanges: function() {
7699  return false;
7700 },
7701 GetConfirmUpdateText: function() {
7702  return "";
7703 },
7704 NeedConfirmOnCallback: function(dxCallbackOwner) {
7705  return true;
7706 },
7707 NeedConfirmOnPostback: function() {
7708  if(ASPx.IsUploadSubmitRequest)
7709   return !ASPx.IsUploadSubmitRequest(this.GetControlParentForm(
7709));
7710  return true;
7711 },
7712 ResetClientChanges: function() {
7713 },
7714 ConfirmOnCustomControlEvent: function() {
7715  var confirmMessage = this.GetConfirmUpdateText();
7716  if(confirmMessage)
7717   return confirm(confirmMessage);
7718  return false;
7719 }
7720});
7721var ControlCallbackHandlersQueue = ASPx.CreateClass(null, {
7722 constructor: function (owner) {
7723  this.owner = owner;
7724  this.handlerInfos = [];
7725 },
7726 addCallbackHandler: function(handlerInfo) {
7727  this.handlerInfos.push(handlerInfo);
7728 },
7729 executeCallbacksHandlers: function() {
7730  for(var i = 0, handlerInfo; handlerInfo = this.handlerInfos[i]; i++)
7731   handlerInfo.handler.call(this.owner, handlerInfo.result);
7732  this.handlerInfos = [];
7733 }
7734});
7735var ControlCallbackQueueHelper = ASPx.CreateClass(null, {
7736 constructor: function (owner) {
7737  this.owner = owner;
7738  this.pendingCallbacks = [];
7739  this.receivedCallbacks = [];
7740  this.attachEvents();
7741 },
7742 showLoadingElements: function () {
7743  this.owner.ShowLoadingDiv();
7744  if (this.owner.IsCallbackAnimationEnabled())
7745   this.owner.StartBeginCallbackA
7745nimation();
7746  else
7747   this.owner.ShowLoadingElementsInternal();
7748 },
7749 attachEvents: function () {
7750  this.owner.EndCallback.AddHandler(this.onEndCallback.aspxBind(this));
7751  this.owner.CallbackError.AddHandler(this.onCallbackError.aspxBind(this));
7752 },
7753 detachEvents: function () {
7754  this.owner.EndCallback.RemoveHandler(this.onEndCallback);
7755  this.owner.CallbackError.RemoveHandler(this.onCallbackError);
7756 },
7757 onCallbackError: function (owner, result) {
7758  this.sendErrorToChildControl(result);
7759 },
7760 ignoreDuplicates: function () {
7761  return true;
7762 },
7763 hasDuplicate: function (arg) {
7764  for (var i in this.pendingCallbacks) {
7765   if (this.pendingCallbacks.hasOwnProperty(i) && this.pendingCallbacks[i].arg == arg && this.pendingCallbacks[i].state != ASPx.callbackState.aborted)
7766    return true;
7767  }
7768  return false;
7769 },
7770 getToken: function (halperContext, callbackInfo) {
7771  return {
7772   cancel: function () {
7773    if (callbackInfo.state == ASPx.callbackState.sent) {
7774     callbackInfo.state = ASPx.callbackState.aborted;
7775     halperContext.sendNext();
7776    }
7777    if (callbackInfo.state == ASPx.callbackState.inTurn)
7778     ASPx.Data.ArrayRemove(halperContext.pendingCallbacks, callbackInfo);
7779   },
7780   callbackId: -1
7781  }
7782 },
7783 sendCallback: function (arg, handlerContext, handler, commandName) {
7784  if (this.ignoreDuplicates() && this.hasDuplicate(arg))
7785   return false;
7786  var handlerContext = handlerContext || this.owner;
7787  var callbackInfo = {
7788   arg: arg,
7789   handlerContext: handlerContext,
7790   handler: handler || handlerContext.OnCallback,
7791   state: ASPx.callbackState.inTurn, callbackId: -1
7792  };
7793  this.pendingCallbacks.push(callbackInfo);
7794  if (!this.hasActiveCallback()) {
7795   callbackInfo.callbackId = this.owner.CreateCallback(arg, commandName);
7796   callbackInfo.state = ASPx.callbackState.sent;
7797  }
7798  return this.getToken(this, callbackInfo);
7799 },
7800 hasActiveCallback: function () {
7801  return this.getCallbacksInfoByState(ASPx.callbackState.sent).length > 0;
7802 },
7803 sendNext: function () {
7804  var nextCallbackInfo = this.getCallbacksInfoByState(ASPx.callbackState.inTurn)[0];
7805  if (nextCallbackInfo) {
7806   nextCallbackInfo.callbackId = this.owner.CreateCallback(nextCallbackInfo.arg);
7807   nextCallbackInfo.state = ASPx.callbackState.sent;
7808   return nextCallbackInfo.callbackId;
7809  }
7810 },
7811 onEndCallback: function () {
7812  if (!this.owner.isErrorOnCallback && this.hasPendingCallbacks()) {
7813   var curCallbackId;
7814   var curCallbackInfo;
7815   var handlerContext;
7816   for (var i in this.receivedCallbacks) {
7817    if(!this.receivedCallbacks.hasOwnProperty(i))
7818     continue;
7819    curCallbackId = this.receivedCallbacks[i];
7820    curCallbackInfo = this.getCallbackInfoById(curCallbackId);
7821    if (curCallbackInfo.state != ASPx.callbackState.aborted) {
7822     handlerContext = curCallbackInfo.handlerContext;
7823     if (handlerContext.OnEndCallback)
7824      handlerContext.OnEndCallback();
7825     this.sendNext();
7826    }
7827    ASPx.Data.ArrayRemove(this.pendingCallbacks, curCallbackInfo);
7828   }
7829   ASPx.Data.ArrayClear(this.receivedCallbacks);
7830  }
7831 },
7832 hasPendingCallbacks: function () {
7833  return this.pendingCallbacks && this.pendingCallbacks.length && this.pendingCallbacks.length > 0;
7834 },
7835 processCallback: function (result, callbackId) {
7836  this.receivedCallbacks.push(callbackId);
7837  if (this.hasPendingCallbacks()) {
7838   var callbackInfo = this.getCallbackInfoById(callbackId);
7839   if (callbackInfo.state != ASPx.callbackState.aborted)
7840    callbackInfo.handler.call(callbackInfo.handlerContext, result);
7841  }
7842 },
7843 getCallbackInfoById: function (id) {
7844  for (var i in this.pendingCallbacks) {
7845   if (this.pendingCallbacks.hasOwnProperty(i) && this.pendingCallbacks[i].callbackId == id)
7846    return this.pendingCallbacks[i];
7847  }
7848 },
7849 getCallbacksInfoByState: function (state) {
7850  var result = [];
7851  for (var i in this.pendingCallbacks) {
7852   if (this.pendingCallbacks.hasOwnProperty(i) && this.pendingCallbacks[i].state == state)
7853    result.push(this.pendingCallbacks[i]);
7854  }
7855  return result;
7856 },
7857 sendErrorToChildControl: function (callbackObj) {
7858  if (!this.hasPendingCallbacks())
7859   return;
7860  var callbackInfo = this.getCallbackInfoById(callbackObj.callbackId || 0);
7861  if (!callbackInfo)
7862   return;
7863  var hasChildControlHandler = (callbackInfo.handlerContext != this.owner) && callbackInfo.handlerContext.OnCallbackError;
7864  if (hasChildControlHandler)
7865   callbackInfo.handlerContext.OnCallbackError.call(callbackInfo.handlerContext, callbackObj.message, callbackObj.data);
7866 }
7867});
7868var AccessibilityHelperBase = ASPx.CreateClass(null, {
7869 constructor: function(control) {
7870  this.control = control;
7871  this.timerID = -1;
7872  this.pronounceMessageTimeout = 500;
7873  this.activeItem = this.getItems()[0];
7874  this.pronounceIsStarted = false;
7875 },
7876 PronounceMessage: function(text, activeItemArgs, inactiveItemArgs, mainElementArgs, ownerMainElement) {   
7877  this.timerID = ASPx.Timer.ClearTimer(this.timerID);
7878  this.pronounceIsStarted = true;
7879  this.timerID = window.setTimeout(function() {
7880   this.PronounceMessageCore(text, activeItemArgs, inactiveItemArgs, mainElementArgs, ownerMainElement);
7881  }.aspxBind(this), this.getPronounceTimeout());
7882 },
7883 PronounceMessageCore: function(text, activeItemArgs, inactiveItemArgs, mainElementArgs, ownerMainElement) {
7884  if(!this.getItems())
7885   return;
7886  this.toogleItem();
7887  var mainElement = this.getMainElement();
7888  var activeItem = this.getItem(true);
7889  var inactiveItem = this.getItem();
7890  if(ASPx.Attr.GetAttribute(mainElement, "role") != "application")
7891   mainElementArgs = this.addArguments(mainElementArgs, { "aria-activedescendant" : activeItem.id });
7892  var messageAttrObj = {};
7893  var activeItemRole = ASPx.Attr.GetAttribute(activeItem, "role");
7894  var attrName = activeItemRole == "combobox" ? "aria-label" : "innerHtml";
7895  messageAttrObj[attrName] = ASPx.Str.EncodeHtml(text);
7896  activeItemArgs = this.addArguments(activeItemArgs, messageAttrObj);
7897  messageAttrObj[attrName] = "";
7898  inactiveItemArgs = this.addArguments(inactiveItemArgs, messageAttrObj);
7899  var errorTextElement = null;
7900  if(this.control.GetErrorCell()) {
7901   errorTextElement = this.getAriaExplanatoryTextManager().GetErrorTextElement();
7902   activeItemArgs = this.addArguments(activeItemArgs,   {"aria-invalid"  : !this.control.isValid ? "true" : "" });
7903   mainElementArgs = this.addArguments(mainElementArgs, { "aria-invalid" : "" });
7904   inactiveItemArgs = this.addArguments(inactiveItemArgs,  { "aria-invalid" : "" });
7905  }
7906  this.changeActivityAttributes(activeItem, activeItemArgs);
7907  if(errorTextElement) {
7908   this.getAriaExplanatoryTextManager().SetOrRemoveText([activeItem], errorTextElement, !this.control.isValid, false, true);
7909   this.getAriaExplanatoryTextManager().SetOrRemoveText([mainElement, inactiveItem], errorTextElement, false, false, false);
7910  }
7911  this.changeActivityAttributes(mainElement, mainElementArgs);
7912  if(!!ownerMainElement && ASPx.Attr.GetAttribute(ownerMainElement, "role") != "application")
7913   this.changeActivityAttributes(ownerMainElement, { "aria-activedescendant": activeItem.id });
7914  this.changeActivityAttributes(inactiveItem, inactiveItemArgs);
7915  this.pronounceIsStarted = false;
7916 },
7917 GetActiveElement: function(inputIsMainElement) {
7918  if(this.pronounceIsStarted) return null;
7919  var mainElement = inputIsMainElement ? this.control.GetInputElement() : this.getMainElement();
7920  var activeElementId = ASPx.Attr.GetAttribute(mainElement, 'aria-activedescendant');
7921  return activeElementId ? ASPx.GetElementById(activeElementId) : mainElement;
7922 },
7923 getMainElement: function() {
7924  if(!ASPx.IsExistsElement(this.mainElement))
7925   this.mainElement = this.control.GetAccessibilityAssistantElement();
7926  return this.mainElement;
7927 },
7928 getItems: function() {
7929  if(!ASPx.IsExistsElement(this.items))
7930   this.items = ASPx.GetChildElementNodes(this.getMainElement());
7931  return this.items;
7932 },
7933 getItem: function(isActive) {
7934  if(isActive)
7935   return this.activeItem;
7936  var items = this.getItems();
7937  return items[0] === this.activeItem ? items[1] : items[0];
7938 },
7939 getAriaExplanatoryTextManager: function() { return this.control.ariaExplanatoryTextManager; },
7940 getPronounceTimeout: function() { return this.pronounceMessageTimeout; },
7941 toogleItem: function() {
7942  this.activeItem = this.getItem();
7943 },
7944 addArguments: function(targetArgs, newArgs) {
7945  if(!targetArgs) targetArgs = { };
7946  for(var key in newArgs) {
7947   if(!targetArgs.hasOwnProperty(key))
7948    targetArgs[key] = newArgs[key];
7949  }
7950  return targetArgs;
7951 },
7952 changeActivityAttributes: function(element, args) {
7953  if(!element)
7954   return;
7955  for(var key in args) {
7956   var value = args[key];
7957   if(key == "innerHtml")
7958    ASPx.SetInnerHtml(element, value);
7959   else {
7960    var action = value !== "" ? ASPx.Attr.SetAttribute : ASPx.Attr.RemoveAttribute;
7961    action(element, key, value);
7962   }
7963  }
7964 }
7965});
7966var AccessibilityPronouncer = ASPx.CreateClass(null, {
7967 constructor: function() {
7968  this.pronouncerId = "dxPronouncer";
7969  this.initialized = false;
7970  this.focusableMessageElement = null;
7971  this.messageElement = null;
7972  this.pronouncers = {
7973   live: new AccessibilityLivePronouncer(this),
7974   descendant: new AccessibilityDescendantPronouncer(this)
7975  }
7976 },
7977 Pronounce: function(args, type) {
7978  this.pronouncers[type].Pronounce(args);
7979 },
7980 EnsureInitialize: function() {
7981  if(!this.initialized)
7982   this.initialize();
7983 },
7984 RemoveState: function() {
7985  for(var pronouncer in this.pronouncers)
7986   pronouncer.RemoveState();
7987 },
7988 RestoreControlState: function(type, mainElement) {
7989  this.pronouncers[type].RestoreControlState(mainElement);
7990 },
7991 RestoreElementsState: function(type, elements) {
7992  this.pronouncers[type].RestoreElementsState(elements);
7993 },
7994 RestoreElementState: function(type, element) {
7995  this.pronouncers[type].RestoreElementState(element);
7996 },
7997 initialize: function() {
7998  this.createFocusableMessageElement();
7999  this.createMessageElement();
8000  this.prepareFocusableMessageElement();
8001  this.setAttributesForKeyboardNavigation();
8002  this.initialized = true;
8003 },
8004 createFocusableMessageElement: function() {
8005  var focusableMessageElement = document.createElement("DIV");
8006  document.body.appendChild(focusableMessageElement);
8007  this.focusableMessageElement = focusableMessageElement;   
8008 },
8009 prepareFocusableMessageElement: function() {
8010  this.focusableMessageElement.className = "dxAIFME";
8011  this.preventPageScrollingOnSpace();
8012 },
8013 preventPageScrollingOnSpace: function() {
8014  ASPx.Evt.AttachEventToElement(this.focusableMessageElement, 'keydown', function (evt) {
8015   if(ASPx.Evt.GetKeyCode(evt) == ASPx.Key.Space)
8016    return ASPx.Evt.PreventEventAndBubble(evt);
8017  });
8018 }, 
8019 setAttributesForKeyboardNavigation: function() {
8020  ASPx.Attr.Aria.SetApplicationRole(this.focusableMessageElement);
8021  ASPx.Attr.Aria.SetSilence(this.focusableMessageElement);
8022 },
8023 createMessageElement: function() {
8024  var messageElement = document.createElement("DIV");
8025  messageElement.id = this.pronouncerId;
8026  ASPx.Attr.SetAttribute(messageElement, "role", "note");
8027  this.focusableMessageElement.appendChild(messageElement);
8028  this.messageElement = messageElement;
8029 },
8030 getMessage: function(messagePartsArg) {
8031  var messageParts = messagePartsArg.filter(function(x) { return ASPx.IsExists(x); });
8032  return messageParts.join(", ");
8033 }
8034});
8035var AccessibilityPronouncerBase = ASPx.CreateClass(null, {
8036 constructor: function() {
8037  this.state = { };
8038 },
8039 Pronounce: function(args) {
8040  var messageElement = this.getMessageElement();
8041  ASPx.Attr.Aria.SetOrRemoveLabel(messageElement);
8042  ASPx.SetInnerHtml(messageElement, "");
8043  this.PronounceCore(args);
8044 },
8045 PronounceCore: function(args) { },
8046 SaveElementState: function(element) { 
8047  if(this.state[element.id])
8048   return;
8049  this.state[element.id] = {
8050   element: element,
8051   descendant: ASPx.Attr.GetAttribute(element, ASPx.Attr.Aria.descendant)
8052  }
8053 },
8054 RemoveState: function() {
8055  this.state = { };
8056 },
8057 RestoreControlState: function(mainElement) { 
8058  for(var elementInfo in this.state) {
8059   var element = this.state[elementInfo].element;
8060   if(!mainElement || ASPx.GetIsParent(mainElement, element))
8061    this.RestoreElementState(element);
8062  }
8063 },
8064 RestoreElementsState: function(elements) { 
8065  for(var i = 0; i < elements.length; i++)
8066   this.RestoreElementState(elements[i]);
8067 },
8068 RestoreElementState: function(element) {
8069  var elementState = this.state[element.id];
8070  if(!elementState)
8071   return;
8072  var messageElement = this.getMessageElement();
8073  ASPx.Attr.Aria.SetOrRemoveDescendant(element, elementState.descendant);
8074  delete this.state[element.id];
8075 },
8076 getMessage: function(args) {
8077  return ASPx.AccessibilityPronouncer.getMessage(args.messageParts);
8078 },
8079 getMessageElement: function() {
8080  return ASPx.AccessibilityPronouncer.messageElement;
8081 },
8082 getFocusableMessageElement: function() {
8083   return ASPx.AccessibilityPronouncer.focusableMessageElement;
8084 }
8085});
8086var AccessibilityLivePronouncer = ASPx.CreateClass(AccessibilityPronouncerBase, {
8087 constructor: function() {
8088  this.constructor.prototype.constructor.call(this);
8089 },
8090 PronounceCore: function(args) {
8091  var message = this.getMessage(args);
8092  var messageElement = this.getMessageElement();
8093  ASPx.Attr.SetAttribute(this.getFocusableMessageElement(), "aria-live", "assertive");
8094  ASPx.Attr.Aria.SetAtomic(this.getFocusableMessageElement(), "true");
8095  ASPx.SetInnerHtml(messageElement, ASPx.Str.EncodeHtml(message));
8096 }
8097});
8098var AccessibilityDescendantPronouncer = ASPx.CreateClass(AccessibilityPronouncerBase, {
8099 constructor: function() {
8100  this.constructor.prototype.constructor.call(this);
8101 },
8102 PronounceCore: function(args) {
8103  var message = this.getMessage(args);
8104  var activeElement = ASPx.GetActiveElement();
8105  var messageElement = this.getMessageElement();
8106  this.SaveElementState(activeElement);
8107  ASPx.Attr.RemoveAttribute(this.getFocusableMessageElement(), "aria-live");
8108  ASPx.Attr.RemoveAttribute(this.getFocusableMessageElement(), "aria-atomic");
8109  ASPx.Attr.Aria.SetOrRemoveLabel(messageElement, message);
8110  ASPx.Attr.Aria.SetOrRemoveDescendant(activeElement, messageElement.id);
8111 }
8112});
8113ASPx.AccessibilityPronouncerType = {
8114 live: "live",
8115 descendant: "descendant"
8116};
8117ASPx.AccessibilityPronouncer = new AccessibilityPronouncer();
8118var RestoreFocusHelper = ASPx.CreateClass(null, {
8119 constructor: function() {
8120  this.excludedIDs = [ "DXCBtn" ]; 
8121  this.pronouncerType = ASPx.AccessibilityPronouncerType.live;
8122  this.callbackQueue = [];
8123  this.Initialize();
8124 },
8125 Initialize: function() {
8126  var that = this;
8127  ASPx.Evt.AttachEventToDocumentCore("DOMContentLoaded", function() {
8128   ASPxClientControl.GetControlCollection().BeginCallback.AddHandler(that.OnBeginCallback, that);
8129   ASPxClientControl.GetControlCollection().EndCallback.AddHandler(that.OnEndCallback, that);
8130  });
8131 },
8132 OnBeginCallback: function(s, e) {
8133  var control = e.control;
8134  if(!control.allowRestoreFocusOnCallbacks())
8135   return;
8136  control.cpFocusTreeLine = this.getFocusTreeLine(control);
8137  var controlHasCallbackTreeLine = this.callbackQueueContainsTreeLine(control);
8138  this.pushTreeLineInfoIntoCallbackQueue(control);
8139  if(control.cpFocusTreeLine && !controlHasCallbackTreeLine)
8140   control.SendMessageToAssistiveTechnology(this.getDefaultCallbackMessage());
8141 },
8142 OnEndCallback: function(s, e) {
8143  var control = e.control;
8144  if(!control.allowRestoreFocusOnCallbacks())
8145   return;
8146  var treeLineInfo = this.shiftTreeLineInfoFromCallbackQueue(control);
8147  if(treeLineInfo.queueLength == 0) {
8148   if(!control.cpFocusTreeLine && treeLineInfo.treeLine)
8149    control.cpFocusTreeLine = treeLineInfo.treeLine;
8150   var focusElement = this.findFocusElement(control);
8151   if(!this.handleActivePopupWindow(focusElement))
8152    ASPx.AccessibilityUtils.SetFocusAccessible(focusElement);
8153   delete control.cpFocusTreeLine;
8154  }
8155 },
8156 pushTreeLineInfoIntoCallbackQueue: function(control) {
8157  var controlTreeLine = control.cpFocusTreeLine ? control.cpFocusTreeLine.slice(0) : null;
8158  if(!this.callbackQueue[control.name])
8159   this.callbackQueue[control.name] = [];
8160  this.callbackQueue[control.name].push(controlTreeLine);
8161 },
8162 shiftTreeLineInfoFromCallbackQueue: function(control) {
8163  var treeLineInfo = { queueLength: 0, treeLine: null };
8164  var treeLines = this.callbackQueue[control.name];
8165  if(treeLines && treeLines.length > 0) {
8166   treeLineInfo.treeLine = treeLines.shift();
8167   var linesCount = treeLines.length;
8168   treeLineInfo.queueLength = linesCount;
8169   if(linesCount > 0 && !treeLines[0] && treeLineInfo.treeLine)
8170    treeLines[0] = treeLineInfo.treeLine.slice(0);
8171  }
8172  return treeLineInfo;
8173 },
8174 callbackQueueContainsTreeLine: function(control) {
8175  var treeLines = this.callbackQueue[control.name];
8176  if(!treeLines || treeLines.length == 0) 
8177   return false;
8178  if(treeLines[treeLines.length - 1])
8179   return true;
8180  return false;
8181 },
8182 getDefaultCallbackMessage: function() {
8183  return ASPx.AccessibilitySR.DefaultCallbackMessage;
8184 },
8185 handleActivePopupWindow: function(focusElement) {
8186  if(!ASPx.GetPopupControlCollection)
8187   return false;
8188  var activePopupWindow = ASPx.GetPopupControlCollection().GetCurrentActiveWindowElement();
8189  if(activePopupWindow) {
8190   var popupInfo = ASPx.GetPopupControlCollection().GetPopupWindowFromID(activePopupWindow.id);
8191   if(popupInfo.popupControl.setFocusOnCallback && !popupInfo.popupControl.accessibleFocusElement) {
8192    popupInfo.popupControl.accessibleFocusElement = focusElement;
8193    return true;
8194   }
8195  }
8196  return false;
8197 },
8198 getFocusTreeLine: function(control) {
8199  var element = document.activeElement;
8200  var mainElement = control.GetMainElement();
8201  if(!ASPx.GetIsParent(mainElement, element)) {
8202   var treeInfo = this.findFocusedControlElement(mainElement, element);
8203   element = treeInfo.focusElement;
8204   mainElement = treeInfo.rootElement;
8205  }
8206  return this.getTreeLineCore(mainElement, element);
8207 },
8208 getTreeLineCore: function(mainElement, element) {
8209  if(!element) return null;
8210  treeLine = [ ];
8211  while(element) {
8212   treeLine.push({ 
8213    id: element.id,
8214    tagName: element.tagName,
8215    index: ASPx.Data.ArrayIndexOf(element.parentNode.childNodes, element)
8216   });
8217   if(element === mainElement || element === document.body)
8218    break;
8219   element = element.parentNode;
8220  }
8221  return treeLine;
8222 },
8223 findFocusedControlElement: function(mainElement, activeElement) {
8224  var element = null;
8225  var parentElement = mainElement;
8226  var focusedEditor = ASPx.IsExists(ASPx.GetFocusedEditor) ? ASPx.GetFocusedEditor() : null;
8227  if(focusedEditor && ASPx.GetIsParent(mainElement, focusedEditor.GetMainElement()))
8228   element = focusedEditor.GetFocusableInputElement();
8229  else {
8230   if(mainElement && activeElement) {
8231    var mainControl = ASPx.GetClientControlByElementID(mainElement.id);
8232    var parentControls = ASPx.GetParentClientControls(activeElement.id);
8233    for(var i = parentControls.length - 1; i > -1; i--) {   
8234     if(mainControl.name == parentControls[i].name) {
8235      element = activeElement;
8236      var rootIndex = i > 0 ? i - 1 : i;
8237      parentElement = parentControls[rootIndex].GetMainElement();
8238      if(!parentElement && parentControls[rootIndex].GetCurrentWindowElement)
8239       parentElement = parentControls[rootIndex].GetCurrentWindowElement();
8240      break;
8241     }
8242    }
8243   }
8244  }
8245  return { focusElement: element, rootElement: parentElement }; 
8246 },
8247 findFocusElement: function(control) {
8248  if(!control.cpFocusTreeLine)
8249   return;
8250  var treeLine = control.cpFocusTreeLine.slice(0);
8251  var focusElementParent = this.findFocusElementParentById(treeLine);
8252  if(!focusElementParent) 
8253   return;
8254  return this.findFocusElementFromDOMTree(treeLine, focusElementParent);
8255 },
8256 findFocusElementParentById: function(treeLine) {
8257  for(var i = 0; i < treeLine.length; i++) {
8258   var id = treeLine[i].id;
8259   if(!this.isValidId(id))
8260    continue;
8261   var element = document.getElementById(id);
8262   if(element) {
8263    treeLine.splice(i, treeLine.length - i);
8264    treeLine.reverse();
8265    return element;
8266   }
8267  }
8268  return null;
8269 },
8270 findFocusElementFromDOMTree: function(treeLine, focusElementParent) {
8271  var element = focusElementParent;
8272  for(var i = 0; i < treeLine.length; i++) {
8273   var info = treeLine[i];
8274   if(info.index >= element.childNodes.length) {
8275    element = element.childNodes.length > 0 ? element.childNodes[element.childNodes.length - 1] : null;
8276    return this.findNeighbourFocusElement(element, focusElementParent);
8277   }
8278   var child = element.childNodes[info.index];
8279   if(child.tagName !== info.tagName)
8280    return this.findNeighbourFocusElement(child, focusElementParent);
8281   element = child;
8282  }
8283  return element;
8284 },
8285 findNeighbourFocusElement: function(element, focusElementParent) {
8286  if(!element || !element.parentNode) return null;
8287  var neighbours = element.parentNode.childNodes;
8288  var indices = this.calcLeftRightIndices(ASPx.Data.ArrayIndexOf(neighbours, element), neighbours.length);
8289  for(var i = 0; i < indices.length; i++) {
8290   var index = indices[i];
8291   var actionElement = ASPx.FindFirstChildActionElement(neighbours[index]);
8292   if(actionElement)
8293    return actionElement;
8294  }
8295  if(element === focusElementParent)
8296   return null;
8297  return this.findNeighbourFocusElement(element.parentNode, focusElementParent);
8298 },
8299 calcLeftRightIndices: function(startIndex, count) {
8300  var indices = [ ];
8301  var incSides = [ 0, 0 ];
8302  var index = startIndex;
8303  for(var i = 0; i < count; i++) {
8304   indices.push(index);
8305   var even = i % 2 === 0;
8306   var nextIndex = this.calcNextIndex(startIndex, count, incSides, even);
8307   if(nextIndex < 0)
8308    nextIndex = this.calcNextIndex(startIndex, count, incSides, !even);
8309   index = nextIndex;
8310  }
8311  return indices;
8312 },
8313 calcNextIndex: function(startIndex, count, incSides, even) {
8314  var sideIndex = even ? 0 : 1;
8315  var inc = incSides[sideIndex];
8316  inc += even ? -1 : 1;
8317  var nextIndex = startIndex + inc;
8318  if(nextIndex >= 0 && nextIndex < count) {
8319   incSides[sideIndex] = inc;
8320   return nextIndex;
8321  }
8322  return -1;
8323 },
8324 isValidId: function(id) {
8325  return id && !this.isExcludedId(id);
8326 },
8327 isExcludedId: function(id) {
8328  var result = false;
8329  for(var i = 0; i < this.excludedIDs.length; i++) {
8330   if(id.indexOf(this.excludedIDs[i]) > -1) {
8331    result = true;
8332    break;
8333   }
8334  }
8335  return result;
8336 }
8337});
8338var EventStorage = ASPx.CreateClass(null, {
8339 constructor: function() {
8340  this.bag = { };
8341 },
8342 Save: function(e, data, overwrite) {
8343  var key = this.getEventKey(e);
8344  if(this.bag.hasOwnProperty(key) && !overwrite)
8345   return;
8346  this.bag[key] = data;
8347  window.setTimeout(function() { delete this.bag[key]; }.aspxBind(this), 100);
8348 },
8349 Load: function(e) {
8350  var key = this.getEventKey(e);
8351  return this.bag[key];
8352 },
8353 getEventKey: function(e) {
8354  if(ASPx.IsExists(e.timeStamp))
8355   return e.timeStamp.toString();
8356  var eventSource = ASPx.Evt.GetEventSource(e);
8357  var type = e.type.toString();
8358  return eventSource ? type + "_" + eventSource.uniqueID.toString() : type;
8359 }
8360});
8361ASPx.RestoreFocusHelper = new RestoreFocusHelper();
8362EventStorage.Instance = null;
8363EventStorage.getInstance = function() {
8364 if(!EventStorage.Instance)
8365  EventStorage.Instance = new EventStorage();
8366 return EventStorage.Instance;
8367};
8368var GetGlobalObject = function(objectName) {
8369 var fields = objectName.split('.');
8370 var obj = window[fields[0]];
8371 for(var i = 1;
8371 obj && i < fields.length; i++) {
8372  obj = obj[fields[i]];
8373 }
8374 return obj;
8375}
8376var GetExternalScriptProcessor = function() {
8377 return ASPx.ExternalScriptProcessor ? ASPx.ExternalScriptProcessor.getInstance() : null;
8378}
8379var ThemesWithRipple = ['Material'];
8380var RippleHelper = {
8381 rippleTargetClassName: "dxRippleTarget",
8382 rippleTargetExternalClassName: "dxRippleTargetExternal",
8383 rippleContainerClassName: "dxRippleContainer",
8384 rippleClassName: "dxRipple",
8385 touchRadius: -1,
8386 isMobileExternalRipple: null,
8387 zoom: 1,
8388 Init: function() {
8389  if(this.getIsRippleFunctionalityEnabled()) {
8390   setTimeout(function() {
8391    this.calcTouchRadius();
8392   }.aspxBind(this), 0);
8393  }
8394 },
8395 calcTouchRadius: function() {
8396  var testBlock = document.createElement("DIV");
8397  ASPx.SetStyles(testBlock, {
8398   height: "1in",
8399   width: "1in",
8400   left: "-100%",
8401   top: "-100%",
8402   position: "absolute"
8403  });
8404  document.body.appendChild(testBlock);
8405  this.touchRadius = (1.8 / 2.54) * Math.max(testBlock.offsetWidth, testBlock.offsetHeight);
8406  document.body.removeChild(testBlock);
8407 },
8408 isRippleFunctionalityEnabled: null,
8409 checkRippleFunctionality: function() {
8410  if(ASPx.Browser.Safari && ASPx.Browser.Version <= 5.1)
8411   return false;
8412  try {
8413   if(document.styleSheets) {
8414    for(var i = 0; i < document.styleSheets.length; i++) {
8415     var styleSheet = document.styleSheets[i];
8416     if(styleSheet.cssRules) {
8417      for(var j = 0; j < styleSheet.cssRules.length; j++)
8418       for(var k = 0; k < ThemesWithRipple.length; k++)
8419        if(styleSheet.cssRules[j].cssText.indexOf(ThemesWithRipple[k]) !== -1)
8420         return true;
8421     }
8422    }
8423   }
8424  }
8425  catch(exc) { }
8426  return false;
8427 },
8428 ReInit: function() {
8429  this.isRippleFunctionalityEnabled = null;
8430  this.Init();
8431 },
8432 onDocumentMouseDown: function(evt) {
8433  if(RippleHelper.getIsRippleFunctionalityEnabled())
8434   RippleHelper.processMouseDown(evt);
8435 },
8436 getIsRippleFunctionalityEnabled: function() {
8437  if(!ASPx.IsExists(this.isRippleFunctionalityEnabled))
8438   this.isRippleFunctionalityEnabled = this.checkRippleFunctionality();
8439  return this.isRippleFunctionalityEnabled;
8440 },
8441   createTargetInfo: function(target) {
8442  return { 
8443   x: ASPx.GetAbsoluteX(target),
8444   y: ASPx.GetAbsoluteY(target),
8445   width: target.offsetWidth,
8446   height: target.offsetHeight,
8447   classNames: ASPx.GetClassNameList(target),
8448   getTarget: function() { return target; },
8449   getRect: function() { return {x: this.x, y: this.y, width: this.width, height: this.height }; }
8450  };
8451 },
8452 createEventInfo: function(evt) {
8453  return { x: this.getEventX(evt), y: this.getEventY(evt) };
8454 },
8455 processMouseDown: function(evt) {
8456  var evtSource = ASPx.Evt.GetEventSource(evt);
8457  var rippleTarget = this.getRippleTargetElement(evtSource);
8458  if(this.needToProcessRipple(rippleTarget, evtSource))
8459   this.processRipple(this.createTargetInfo(rippleTarget), this.createEventInfo(evt));
8460 },
8461 getRippleTargetElement: function(evtSource) {
8462  if(this.hasRippleMarker(evtSource))
8463   return evtSource;
8464  if(evtSource.tagName && evtSource.tagName.toLowerCase() == "input" && ASPx.ElementContainsCssClass(evtSource, "dxTI")) {
8465   var elements = ASPx.GetChildElementNodesByPredicate(evtSource.parentNode.parentNode, function(element) {
8466    return this.hasRippleMarker(element);
8467   }.aspxBind(this));
8468   return elements && elements[0];
8469  }
8470  return ASPx.GetParent(evtSource, function(element) {
8471   return this.hasRippleMarker(element);
8472  }.aspxBind(this));
8473 },
8474 hasRippleMarker: function(element) {
8475  if(!ASPx.IsExistsElement(element))
8476   return false;
8477  var computedStyles = window.getComputedStyle(element, ":before");
8478  if(ASPx.IsExists(computedStyles)) {
8479   var content = computedStyles.getPropertyValue("content");
8480   if(content.indexOf(this.rippleTargetExternalClassName) > -1) {
8481    ASPx.AddClassNameToElement(element, this.rippleTargetExternalClassName);
8482    return true;
8483   }
8484   return content.indexOf(this.rippleTargetClassName) > -1;
8485  }
8486  return false;
8487 },
8488 needToProcessRipple: function(rippleTarget, evtSource) {
8489  if(!rippleTarget || !ASPx.AnimationUtils)
8490   return false;
8491  var isClearButton = ASPx.ElementContainsCssClass(rippleTarget, "dxeButton") && rippleTarget.id && rippleTarget.id.indexOf("B-100") !== -1;
8492  var isEmptyCalendarDay = ASPx.ElementContainsCssClass(rippleTarget, "dxeCalendarDay") && ASPx.Str.Trim(rippleTarget.textContent) == "";
8493  var rippleIsForbidden = isClearButton || isEmptyCalendarDay || ASPx.GetParentByPartialClassName(rippleTarget, "Disabled") ||
8494   ASPx.ElementContainsCssClass(rippleTarget, "dxgvBatchEditCell") || ASPx.ElementContainsCssClass(rippleTarget, "dxcvEditForm") ||
8495   ASPx.GetParentByPartialClassName(evtSource, "dxcvFocusedCell");
8496  return !rippleIsForbidden;
8497 },
8498 hasBothOverflow: function(style) {
8499  return style.overflow == "scroll" || style.overflow == "auto" || style.overflow == "hidden";
8500 },
8501 hasOverflowX: function(style) {
8502  return style.overflowX == "scroll" || style.overflowX == "auto" || style.overflowX == "hidden";
8503 },
8504 hasOverflowY: function(style) {
8505  return style.overflowY == "scroll" || style.overflowY == "auto" || style.overflowY == "hidden";
8506 },
8507 getExternalRippleContainerSize: function(targetRect) {
8508  if(ASPx.Browser.MobileUI) {
8509   var origTouchRadius = this.getOriginTouchRadius();
8510   if(origTouchRadius < targetRect.width || origTouchRadius < targetRect.height)
8511    origTouchRadius = Math.max(targetRect.width, targetRect.height);
8512   return {x: targetRect.x + (targetRect.width - origTouchRadius) / 2, y: targetRect.y + (targetRect.height - origTouchRadius) / 2, width: origTouchRadius, height: origTouchRadius };
8513  }
8514  var result = { x: 0, y: 0, width: 0, height: 0 };
8515  var diff = targetRect.width - targetRect.height;
8516  if(diff > 0) {
8517   result.x = targetRect.x;
8518   result.y = targetRect.y - diff / 2;
8519   result.width = targetRect.width;
8520   result.height = targetRect.width;
8521  } else {
8522   result.x = targetRect.x + diff / 2;
8523   result.y = targetRect.y;
8524   result.width = targetRect.height;
8525   result.height = targetRect.height;
8526  }
8527  return result;
8528 },
8529 getInternalContainerSize: function(targetInfo) {
8530  var parentWithOverflow = RippleHelper.getParentWithOverflow(targetInfo.getTarget());
8531  if(!ASPx.IsExists(parentWithOverflow))
8532   return targetInfo;
8533  var parentWithOverflowStyle = ASPx.GetCurrentStyle(parentWithOverflow);
8534  var bothOverflow = this.hasBothOverflow(parentWithOverflowStyle);
8535  var overflowX = this.hasOverflowX(parentWithOverflowStyle);
8536  var overflowY = this.hasOverflowY(parentWithOverflowStyle);
8537  var parentRect = {
8538   x: ASPx.GetAbsoluteX(parentWithOverflow),
8539   y: ASPx.GetAbsoluteY(parentWithOverflow),
8540   width: parentWithOverflow.offsetWidth,
8541   height: parentWithOverflow.offsetHeight
8542  };
8543  return this.getInternalContainerSizeCore(targetInfo, parentRect, bothOverflow, overflowX, overflowY);
8544 },
8545 getInternalContainerSizeCore: function(targetRect, parentRect, bothOverflow, overflowX, overflowY) {
8546  var result = {};
8547  ASPx.Data.MergeHashTables(result, targetRect);
8548  if(bothOverflow || overflowX) {
8549   result.x = targetRect.x < parentRect.x ? parentRect.x : targetRect.x;
8550   if(targetRect.x + targetRect.width > parentRect.x + parentRect.width)
8551    result.width = parentRect.x + parentRect.width - targetRect.x;
8552   if(parentRect.x > targetRect.x)
8553    result.width -= (parentRect.x - targetRect.x);
8554  }
8555  if(bothOverflow || overflowY) {
8556   result.y = targetRect.y < parentRect.y ? parentRect.y : targetRect.y;
8557   if(targetRect.y + targetRect.height > parentRect.y + parentRect.height)
8558    result.height = parentRect.y + parentRect.height - targetRect.y;
8559   if(parentRect.y > targetRect.y)
8560    result.height -= (parentRect.y - targetRect.y);
8561  }
8562  return result;
8563 },
8564 calculateRippleContainerSize: function(targetInfo, isExternalRipple) {
8565  return isExternalRipple ? this.getExternalRippleContainerSize(targetInfo) : this.getInternalContainerSize(targetInfo);
8566 },
8567 getParentWithOverflow: function(rippleTarget) {
8568  var result = ASPx.GetParent(rippleTarget, function(element) {
8569   var elementStyle = ASPx.GetCurrentStyle(element);
8570   return this.hasBothOverflow(elementStyle) || this.hasOverflowX(elementStyle) || this.hasOverflowY(elementStyle);
8571  }.aspxBind(this));
8572  return result;
8573 },
8574 getDuration: function(targetInfo) {
8575  return this.IsExternalRipple(targetInfo) || ASPx.Browser.MobileUI ? 650 : 450;
8576 },
8577 createRippleTransition: function(container, rippleElement, radius, targetInfo) {
8578  var rippleSize = 2 * radius;
8579  var transitionProperties = {
8580   width: { from: 0, to: rippleSize, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "width", unit: "px" },
8581   height: { from: 0, to: rippleSize, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "height", unit: "px" },
8582   marginLeft: { from: 0, to: -rippleSize / 2, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "marginLeft", unit: "px" },
8583   marginTop: { from: 0, to: -rippleSize / 2, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "marginTop", unit: "px" },
8584   opacity: { from: 1, to: 0.05, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "o
8584pacity", unit: "%" }
8585  };
8586  var rippleTransition = ASPx.AnimationUtils.createMultipleAnimationTransition(rippleElement, {
8587   transition: ASPx.AnimationConstants.Transitions.RIPPLE,
8588   duration: this.getDuration(targetInfo),
8589   onComplete: function(element) {
8590    ASPx.RemoveElement(container);
8591   }
8592  });
8593  rippleTransition.Start(transitionProperties);
8594 },
8595 calculateRadius: function(isExternalRipple, posX, posY, containerRect) {
8596  var radius = -1;
8597  if(isExternalRipple) {
8598   if(ASPx.Browser.MobileUI)
8599    radius = this.getOriginTouchRadius() / 2;
8600   else
8601    radius = Math.max(containerRect.height, containerRect.width);
8602  } else {
8603   var width1 = posX - containerRect.x;
8604   var width2 = containerRect.width - width1;
8605   var height1 = posY - containerRect.y;
8606   var height2 = containerRect.height - height1;
8607   var rippleWidth = Math.max(width1, width2);
8608   var rippleHeight = Math.max(height1, height2);
8609   radius = Math.sqrt(Math.pow(rippleHeight, 2) + Math.pow(rippleWidth, 2));
8610  }
8611  return radius;
8612 },
8613 createRippleElement: function(container, rippleCenter) {
8614  var rippleElement = document.createElement("DIV");
8615  rippleElement.className = this.rippleClassName;
8616  container.appendChild(rippleElement);
8617  ASPxClientUtils.SetAbsoluteX(rippleElement, rippleCenter.x);
8618  ASPxClientUtils.SetAbsoluteY(rippleElement, rippleCenter.y);
8619  return rippleElement;
8620 },
8621 processRipple: function(targetInfo, eventInfo) {
8622  this.initRippleProcess();
8623  var isExternalRipple = this.IsExternalRipple(targetInfo);
8624  var rippleCenter = this.getRippleCenter(targetInfo.getRect(), eventInfo, isExternalRipple);
8625  var container = this.createRippleContainer(targetInfo, isExternalRipple);
8626  var rippleElement = this.createRippleElement(container, rippleCenter);
8627  var radius = this.calculateRadius(isExternalRipple, rippleCenter.x, rippleCenter.y, this.getElementRect(container));
8628  this.createRippleTransition(container, rippleElement, radius, targetInfo);
8629 },
8630 initRippleProcess: function() {
8631  this.isMobileExternalRipple = null;
8632  this.zoom = screen.width / window.innerWidth;
8633 },
8634 getRippleCenter: function(targetInfo, eventInfo, isExternalRipple) {
8635  var posX = 0;
8636  var posY = 0;
8637  if(isExternalRipple) {
8638   posX = targetInfo.x + targetInfo.width / 2;
8639   posY = targetInfo.y + targetInfo.height / 2;
8640  } else {
8641   posX = eventInfo.x;
8642   posY = eventInfo.y;
8643  }
8644  return {x: posX, y: posY};
8645 },
8646 createRippleContainer: function(targetInfo, isExternalRipple) {
8647  var containerParent = targetInfo.getTarget();
8648  if(!containerParent)
8649   return;
8650  var containerTagName = containerParent.tagName == "TR" ? "TD" : "DIV";
8651  var container = document.createElement(containerTagName);
8652  container.className = this.rippleContainerClassName;
8653  if(containerParent.parentNode && containerParent.tagName == "IMG")
8654   containerParent = containerParent.parentNode;
8655  containerParent.appendChild(container);
8656  if(isExternalRipple)
8657   container.style.borderRadius = "50%";
8658  var containerRect = this.calculateRippleContainerSize(targetInfo, isExternalRipple);
8659  this.assignContainerSettings(container, containerRect);
8660  return container;
8661 },
8662 assignContainerSettings: function(container, containerRect) {
8663  var properties = {
8664   height: containerRect.height,
8665   width: containerRect.width,
8666   left: ASPx.PrepareClientPosForElement(containerRect.x, container, true),
8667   top: ASPx.PrepareClientPosForElement(containerRect.y, container, false)
8668  };
8669  if(ASPx.Browser.MobileUI)
8670   ASPx.Data.MergeHashTables(properties, {marginTop: 0, marginLeft: 0 });
8671  ASPx.SetStyles(container, properties, ASPx.Browser.MobileUI);
8672 },
8673 IsExternalRipple: function(targetInfo) {
8674  var hasExternalRippleClassName = ASPx.ElementContainsCssClass(targetInfo.getTarget(), this.rippleTargetExternalClassName);
8675  if(!ASPx.Browser.MobileUI)
8676   return hasExternalRippleClassName;
8677  return hasExternalRippleClassName || this.IsMobileExternalRipple(targetInfo);
8678 },
8679 IsMobileExternalRipple: function(targetInfo) {
8680  if(this.isMobileExternalRipple == null) {
8681   var originTouchRadius = this.getOriginTouchRadius();
8682   this.isMobileExternalRipple = ASPx.Browser.MobileUI && targetInfo.width < originTouchRadius && targetInfo.height < originTouchRadius;
8683  }
8684  return this.isMobileExternalRipple;
8685 },
8686 RemoveRippleContainer: function(element) {
8687  var childs = ASPx.GetChildNodesByClassName(element, this.rippleContainerClassName);
8688  var rippleContainer = childs.length > 0 ? childs[0] : null;
8689  if(rippleContainer != null)
8690   rippleContainer.parentNode.removeChild(rippleContainer);
8691 },
8692 getEventX: function(evt) {
8693  return ASPxClientUtils.GetEventX(evt);
8694 },
8695 getEventY: function(evt) {
8696  return ASPxClientUtils.GetEventY(evt);
8697 },
8698 getOriginTouchRadius: function() {
8699  return this.touchRadius / this.zoom;
8700 },
8701 getElementRect: function(element) {
8702  return { x: ASPx.GetAbsoluteX(element), y: ASPx.GetAbsoluteY(element), width: element.offsetWidth, height: element.offsetHeight };
8703 }
8704}
8705var AccessibilitySR = {
8706 AddStringResources: function(stringResourcesObj) {
8707  if(stringResourcesObj) {
8708   for(var key in stringResourcesObj)
8709    this[key] = stringResourcesObj[key];
8710  }
8711 }
8712};
8713ASPx.CollectionBase = CollectionBase;
8714ASPx.FunctionIsInCallstack = _aspxFunctionIsInCallstack;
8715ASPx.RaisePostHandlerOnPost = aspxRaisePostHandlerOnPost;
8716ASPx.GetPostHandler = aspxGetPostHandler;
8717ASPx.ProcessScriptsAndLinks = _aspxProcessScriptsAndLinks;
8718ASPx.InitializeLinks = _aspxInitializeLinks;
8719ASPx.InitializeScripts = _aspxInitializeScripts;
8720ASPx.RunStartupScripts = _aspxRunStartupScripts;
8721ASPx.IsStartupScriptsRunning = _aspxIsStartupScriptsRunning;
8722ASPx.AddScriptsRestartHandler = _aspxAddScriptsRestartHandler;
8723ASPx.GetFocusedElement = _aspxGetFocusedElement;
8724ASPx.GetDomObserver = _aspxGetDomObserver;
8725ASPx.CacheHelper = CacheHelper;
8726ASPx.ControlTree = ControlTree;
8727ASPx.ControlCallbackHandlersQueue = ControlCallbackHandlersQueue;
8728ASPx.ResourceManager = ResourceManager;
8729ASPx.UpdateWatcherHelper = UpdateWatcherHelper;
8730ASPx.EventStorage = EventStorage;
8731ASPx.GetGlobalObject = GetGlobalObject;
8732ASPx.GetExternalScriptProcessor = GetExternalScriptProcessor;
8733ASPx.CheckBoxCheckState = CheckBoxCheckState;
8734ASPx.CheckBoxInputKey = CheckBoxInputKey;
8735ASPx.CheckableElementStateController = CheckableElementStateController;
8736ASPx.CheckableElementHelper = CheckableElementHelper;
8737ASPx.CheckBoxInternal = CheckBoxInternal;
8738ASPx.CheckBoxInternalCollection = CheckBoxInternalCollection;
8739ASPx.ControlCallbackQueueHelper = ControlCallbackQueueHelper;
8740ASPx.EditorStyleDecoration = EditorStyleDecoration;
8741ASPx.AccessibilitySR = AccessibilitySR;
8742ASPx.KbdHelper = KbdHelper;
8743ASPx.AccessKeysHelper = AccessKeysHelper;
8744ASPx.AccessKey = AccessKey;
8745ASPx.IFrameHelper = IFrameHelper;
8746ASPx.Ident = Ident;
8747ASPx.TouchUIHelper = TouchUIHelper;
8748ASPx.ControlUpdateWatcher = ControlUpdateWatcher;
8749ASPx.AccessibilityHelperBase = AccessibilityHelperBase;
8750ASPx.RippleHelper = RippleHelper;
8751ASPx.ThemesWithRipple = ThemesWithRipple;
8752window.ASPxClientEvent = ASPxClientEvent;
8753window.ASPxClientEventArgs = ASPxClientEventArgs;
8754window.ASPxClientCancelEventArgs = ASPxClientCancelEventArgs;
8755window.ASPxClientProcessingModeEventArgs = ASPxClientProcessingModeEventArgs;
8756window.ASPxClientProcessingModeCancelEventArgs = ASPxClientProcessingModeCancelEventArgs;
8757ASPx.Evt.AttachEventToDocument(TouchUIHelper.touchMouseDownEventName, RippleHelper.onDocumentMouseDown);
8758ASPx.classesScriptParsed = true;
8759})();
8760
8761(function () {
8762ASPx.StateItemsExist = false;
8763ASPx.FocusedItemKind = "FocusedStateItem";
8764ASPx.HoverItemKind = "HoverStateItem";
8765ASPx.PressedItemKind = "PressedStateItem";
8766ASPx.SelectedItemKind = "SelectedStateItem";
8767ASPx.DisabledItemKind = "DisabledStateItem";
8768ASPx.CachedStatePrefix = "cached";
8769ASPxStateItem = ASPx.CreateClass(null, {
8770 constructor: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, kind, disableApplyingStyleToLink){
8771  this.name = name;
8772  this.classNames = classNames;
8773  this.customClassNames = [];
8774  this.resultClassNames = [];
8775  this.cssTexts = cssTexts;
8776  this.postfixes = postfixes;
8777  this.imageObjs = imageObjs;
8778  this.imagePostfixes = imagePostfixes;
8779  this.kind = kind;
8780  this.classNamePostfix = kind.substr(0, 1).toLowerCase();
8781  this.enabled = true;
8782  this.needRefreshBetweenElements = false;
8783  this.elements = null;
8784  this.images = null;
8785  this.links = [];
8786  this.linkColor = null;
8787  this.linkTextDecoration = null;
8788  this.disableApplyingStyleToLink = !!disableApplyingStyleToLink; 
8789 },
8790 GetCssText: function(index){
8791  if(ASPx.IsExists(this.cssTexts[index]))
8792   return this.cssTexts[index];
8793  return this.cssTexts[0];
8794 },
8795 CreateStyleRule: function(index){
8796  if(this.GetCssText(index) == "") return "";
8797  var styleSheet = ASPx.GetCurrentStyleSheet();
8798  if(styleSheet)
8799   return ASPx.CreateImportantStyleRule(styleSheet, this.GetCssText(index), this.classNamePostfix);  
8800  return ""; 
8801 },
8802 GetClassName: function(index){
8803  if(ASPx.IsExists(this.classNames[index]))
8804   return this.classNames[index];
8805  return this.classNames[0];
8806 },
8807 GetResultClassName: function(index){
8808  if(!ASPx.IsExists(this.resultClassNames[index])) {
8809   if(!ASPx.IsExists(this.customClassNames[index]))
8810    this.customClassNames[index] = this.CreateStyleRule(index);
8811   if(this.GetClassName(index) != "" && this.customClassNames[index] != "")
8812    this.resultClassNames[index] = this.GetClassName(index) + " " + this.customClassNames[index];
8813   else if(this.GetClassName(index) != "")
8814    this.resultClassNames[index] = this.GetClassName(index);
8815   else if(this.customClassNames[index] != "")
8816    this.resultClassNames[index] = this.customClassNames[index];
8817   else
8818    this.resultClassNames[index] = "";
8819  }
8820  return this.resultClassNames[index];
8821 },
8822 GetElements: function(element){
8823  if(!this.elements || !ASPx.IsValidElements(this.elements)){
8824   if(this.postfixes && this.postfixes.length > 0){
8825    this.elements = [ ];
8826    var parentNode = element.parentNode;
8827    if(parentNode){
8828     for(var i = 0; i < this.postfixes.length; i++){
8829      var id = this.name + this.postfixes[i];
8830      this.elements[i] = ASPx.GetChildById(parentNode, id);
8831      if(!this.elements[i])
8832       this.elements[i] = ASPx.GetElementById(id);
8833     }
8834    }
8835   }
8836   else
8837    this.elements = [element];
8838  }
8839  return this.elements;
8840 },
8841 GetImages: function(element){
8842  if(!this.images || !ASPx.IsValidElements(this.images)){
8843   this.images = [ ];
8844   if(this.imagePostfixes && this.imagePostfixes.length > 0){
8845    var elements = this.GetElements(element);
8846    for(var i = 0; i < this.imagePostfixes.length; i++){
8847     var id = this.name + this.imagePostfixes[i];
8848     for(var j = 0; j < elements.length; j++){
8849      if(!elements[j]) continue;
8850      if(elements[j].id == id)
8851       this.images[i] = elements[j];
8852      else
8853       this.images[i] = ASPx.GetChildById(elements[j], id);
8854      if(this.images[i])
8855       break;
8856     }
8857    }
8858   }
8859  }
8860  return this.images;
8861 },
8862 Apply: function(element){
8863  if(!this.enabled) return;
8864  try{
8865   this.ApplyStyle(element);
8866   if(this.imageObjs && this.imageObjs.length > 0)
8867    this.ApplyImage(element);
8868   if(ASPx.Browser.IE && ASPx.Browser.MajorVersion >= 11)
8869    this.ForceRedrawAppearance(element);
8870  }
8871  catch(e){
8872  }
8873 },
8874 ApplyStyle: function(element){
8875  var elements = this.GetElements(element);
8876  for(var i = 0; i < elements.length; i++){
8877   if(!elements[i]) continue;
8878   var className = elements[i].className.replace(this.GetResultClassName(i), "");
8879   elements[i].className = ASPx.Str.Trim(className) + " " + this.GetResultClassName(i);
8880   if(!ASPx.Browser.Opera || ASPx.Browser.Version >= 9)
8881    this.ApplyStyleToLinks(elements, i);
8882  }
8883 },
8884 ApplyStyleToLinks: function(elements, index){
8885  if(this.disableApplyingStyleToLink)
8886   return;
8887  if(!ASPx.IsValidElements(this.links[index]))
8888   this.links[index] = ASPx.GetNodesByTagName(elements[index], "A");
8889  for(var i = 0; i < this.links[index].length; i++)
8890   this.ApplyStyleToLinkElement(this.links[index][i], index);
8891 },
8892 ApplyStyleToLinkElement: function(link, index){
8893  if(this.GetLinkColor(index) != "")
8894   ASPx.Attr.ChangeAttributeExtended(link.style, "color", link, "saved" + this.kind + "Color", this.GetLinkColor(index));
8895  if(this.GetLinkTextDecoration(index) != "")
8896   ASPx.Attr.ChangeAttributeExtended(link.style, "textDecoration", link, "saved" + this.kind + "TextDecoration", this.GetLinkTextDecoration(index));
8897 },
8898 ApplyImage: function(element){
8899  var images = this.GetImages(element);
8900  for(var i = 0; i < images.length; i++){
8901   if(!images[i] || !this.imageObjs[i]) continue;
8902   var useSpriteImage = typeof(this.imageObjs[i]) != "string";
8903   var newUrl = "", newCssClass = "", newBackground = "";
8904   if(useSpriteImage){
8905    newUrl = ASPx.EmptyImageUrl;           
8906    if(this.imageObjs[i].spriteCssClass) 
8907     newCssClass = this.imageObjs[i].spriteCssClass;
8908    if(this.imageObjs[i].spriteBackground)
8909     newBackground = this.imageObjs[i].spriteBackground;
8910   }
8911   else{
8912    newUrl = this.imageObjs[i];
8913    if(ASPx.Attr.IsExistsAttribute(images[i].style, "background"))   
8914     newBackground = " ";
8915   }
8916   if(newUrl != "")
8917    ASPx.Attr.ChangeAttributeExtended(images[i], "src", images[i], "saved" + this.kind + "Src", newUrl);
8918   if(newCssClass != "")
8919    this.ApplyImageClassName(images[i], newCssClass);
8920   if(newBackground != ""){
8921    if(ASPx.Browser.WebKitFamily) {
8922     var savedBackground = ASPx.Attr.GetAttribute(images[i].style, "background");
8923     if(!useSpriteImage)
8924      savedBackground += " " + images[i].style["backgroundPosition"];
8925     ASPx.Attr.SetAttribute(images[i], "saved" + this.kind + "Background", savedBackground);
8926     ASPx.Attr.SetAttribute(images[i].style, "background", newBackground);
8927    }
8928    else
8929     ASPx.Attr.ChangeAttributeExtended(images[i].style, "background", images[i], "saved" + this.kind + "Background", newBackground);
8930   }     
8931  }
8932 },
8933 ApplyImageClassName: function(element, newClassName){
8934  if(ASPx.Attr.GetAttribute(element, "saved" + this.kind + "ClassName"))
8935   this.CancelImageClassName(element);
8936  var className = element.className
8937  ASPx.Attr.SetAttribute(element, "saved" + this.kind + "ClassName", className);
8938  element.className = className + " " + newClassName;
8939 },
8940 Cancel: function(element){
8941  if(!this.enabled) return;
8942  try{  
8943   if(this.imageObjs && this.imageObjs.length > 0)
8944    this.CancelImage(element);
8945   this.CancelStyle(element);
8946  }
8947  catch(e){
8948  }
8949 },
8950 CancelStyle: function(element){
8951  var elements = this.GetElements(element);
8952  for(var i = 0; i < elements.length; i++){
8953   if(!elements[i]) continue;
8954   var className = ASPx.Str.Trim(elements[i].className.replace(this.GetResultClassName(i), ""));
8955   elements[i].className = className;
8956   if(!ASPx.Browser.Opera || ASPx.Browser.Version >= 9)
8957    this.CancelStyleFromLinks(elements, i);
8958  }
8959 },
8960 CancelStyleFromLinks: function(elements, index){
8961  if(this.disableApplyingStyleToLink)
8962   return;
8963  if(!ASPx.IsValidElements(this.links[index]))
8964   this.links[index] = ASPx.GetNodesByTagName(elements[index], "A");
8965  for(var i = 0; i < this.links[index].length; i++)
8966   this.CancelStyleFromLinkElement(this.links[index][i], index);
8967 },
8968 CancelStyleFromLinkElement: function(link, index){
8969  if(this.GetLinkColor(index) != "")
8970   ASPx.Attr.RestoreAttributeExtended(link.style, "color", link, "saved" + this.kind + "Color");
8971  if(this.GetLinkTextDecoration(index) != "")
8972   ASPx.Attr.RestoreAttributeExtended(link.style, "textDecoration", link, "saved" + this.kind + "TextDecoration");
8973 },
8974 CancelImage: function(element){
8975  var images = this.GetImages(element);
8976  for(var i = 0; i < images.length; i++){
8977   if(!images[i] || !this.imageObjs[i]) continue;
8978   ASPx.Attr.RestoreAttributeExtended(images[i], "src", images[i], "saved" + this.kind + "Src");
8979   this.CancelImageClassName(images[i]);
8980   ASPx.Attr.RestoreAttributeExtended(images[i].style, "background", images[i], "saved" + this.kind + "Background");
8981  }
8982 },
8983 CancelImageClassName: function(element){
8984  var savedClassName = ASPx.Attr.GetAttribute(element, "saved" + this.kind + "ClassName");
8985  if(ASPx.IsExists(savedClassName)) {
8986   element.className = savedClassName;
8987   ASPx.Attr.RemoveAttribute(element, "saved" + this.kind + "ClassName");
8988  }
8989 },
8990 Clone: function(){
8991  return new ASPxStateItem(this.name, this.classNames, this.cssTexts, this.postfixes, 
8992   this.imageObjs, this.imagePostfixes, this.kind, this.disableApplyingStyleToLink);
8993 },
8994 IsChildElement: function(element){
8995  if(element != null){
8996   var elements = this.GetElements(element);
8997   for(var i = 0; i < elements.length; i++){
8998    if(!elements[i]) continue;
8999    if(ASPx.GetIsParent(elements[i], element)) 
9000     return true;
9001   }
9002  }
9003  return false;
9004 },
9005 ForceRedrawAppearance: function(element) {
9006  if(!aspxGetStateController().IsForceRedrawAppearanceLocked()) {
9007   var value = element.style.opacity;
9008   element.style.opacity = "0.7777";
9009   var dummy = element.offsetWidth;
9010   element.style.opacity = value;
9011  }
9012 },
9013 GetLinkColor: function(index){
9014  if(!ASPx.IsExists(this.linkColor)){
9015   var rule = ASPx.GetStyleSheetRules(this.customClassNames[index]);
9016   this.linkColor = rule ? rule.style.color : null;
9017   if(!ASPx.IsExists(this.linkColor)){
9018    var rule = ASPx.GetStyleSheetRules(this.GetClassName(index));
9019    this.linkColor = rule ? rule.style.color : null;
9020   }
9021   if(this.linkColor == null) 
9022    this.linkColor = "";
9023  }
9024  return this.linkColor;
9025 },
9026 GetLinkTextDecoration: function(index){
9027  if(!ASPx.IsExists(this.linkTextDecoration)){
9028   var rule = ASPx.GetStyleSheetRules(this.customClassNames[index]);
9029   this.linkTextDecoration = rule ? rule.style.textDecoration : null;
9030   if(!ASPx.IsExists(this.linkTextDecoration)){
9031    var rule = ASPx.GetStyleSheetRules(this.GetClassName(index));
9032    this.linkTextDecoration = rule ? rule.style.textDecoration : null;
9033   }
9034   if(this.linkTextDecoration == null) 
9035    this.linkTextDecoration = "";
9036  }
9037  return this.linkTextDecoration;
9038 }
9039});
9040ASPxClientStateEventArgs = ASPx.CreateClass(null, {
9041 constructor: function(item, element){
9042  this.item = item;
9043  this.element = element;
9044  this.toElement = null;
9045  this.fromElement = null;
9046  this.htmlEvent = null;
9047 }
9048});
9049ASPxStateController = ASPx.CreateClass(null, {
9050 constructor: function(){
9051  this.focusedItems = { };
9052  this.hoverItems = { };
9053  this.pressedItems = { };
9054  this.selectedItems = { };
9055  this.disabledItems = { };
9056  this.disabledScheme = {};
9057  this.currentFocusedElement = null;
9058  this.currentFocusedItemName = null;
9059  this.currentHoverElement = null;
9060  this.currentHoverItemName = null;
9061  this.currentPressedElement = null;
9062  this.currentPressedItemName = null;
9063  this.savedCurrentPressedElement = null;
9064  this.savedCurrentMouseMoveSrcElement = null;
9065  this.forceRedrawAppearanceLockCount = 0;
9066  this.AfterSetFocusedState = new ASPxClientEvent();
9067  this.AfterClearFocusedState = new ASPxClientEvent();
9068  this.AfterSetHoverState = new ASPxClientEvent();
9069  this.AfterClearHoverState = new ASPxClientEvent();
9070  this.AfterSetPressedState = new ASPxClientEvent();
9071  this.AfterClearPressedState = new ASPxClientEvent();
9072  this.AfterDisabled = new ASPxClientEvent();
9073  this.AfterEnabled = new ASPxClientEvent();
9074  this.BeforeSetFocusedState = new ASPxClientEvent();
9075  this.BeforeClearFocusedState = new ASPxClientEvent();
9076  this.BeforeSetHoverState = new ASPxClientEvent();
9077  this.BeforeClearHoverState = new ASPxClientEvent();
9078  this.BeforeSetPressedState = new ASPxClientEvent();
9079  this.BeforeClearPressedState = new ASPxClientEvent();
9080  this.BeforeDisabled = new ASPxClientEvent();
9081  this.BeforeEnabled = new ASPxClientEvent();
9082  this.FocusedItemKeyDown = new ASPxClientEvent();
9083 }, 
9084 AddHoverItem: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink){
9085  this.AddItem(this.hoverItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.HoverItemKind, disableApplyingStyleToLink);
9086  this.AddItem(this.focusedItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.FocusedItemKind, disableApplyingStyleToLink);
9087 },
9088 AddPressedItem: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes ,disableApplyingStyleToLink){
9089  this.AddItem(this.pressedItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.PressedItemKind, disableApplyingStyleToLink);
9090 },
9091 AddSelectedItem: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink){
9092  this.AddItem(this.selectedItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.SelectedItemKind, disableApplyingStyleToLink);
9093 },
9094 AddDisabledItem: function (name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink, rootId) {
9095  this.AddItem(this.disabledItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes,
9096   ASPx.DisabledItemKind, disableApplyingStyleToLink, this.addIdToDisabledItemScheme, rootId);
9097 },
9098 addIdToDisabledItemScheme: function(rootId, childId) {
9099  if (!rootId)
9100   return;
9101  if (!this.disabledScheme[rootId])
9102   this.disabledScheme[rootId] = [rootId];
9103  if (childId && (rootId != childId) && ASPx.Data.ArrayIndexOf(this.disabledScheme[rootId], childId) == -1)
9104   this.disabledScheme[rootId].push(childId);
9105 },
9106 removeIdFromDisabledItemScheme: function(rootId, childId) {
9107  if (!rootId || !this.disabledScheme[rootId])
9108   return;
9109  ASPx.Data.ArrayRemove(this.disabledScheme[rootId], childId);
9110  if (this.disabledScheme[rootId].length == 0)
9111   delete this.disabledScheme[rootId];
9112 },
9113 AddItem: function (items, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, kind, disableApplyingStyleToLink, onAdd, rootId) {
9114  var stateItem = new ASPxStateItem(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, kind, disableApplyingStyleToLink);
9115  if (postfixes && postfixes.length > 0) {
9116   for (var i = 0; i < postfixes.length; i++) {
9117    items[name + postfixes[i]] = stateItem;
9118    if (onAdd)
9119     onAdd.call(this, rootId, name + postfixes[i]);
9120   }
9121  }
9122  else {
9123   if (onAdd)
9124    onAdd.call(this, rootId, name);
9125   items[name] = stateItem;
9126  }
9127  ASPx.StateItemsExist = true;
9128 },
9129 RemoveHoverItem: function(name, postfixes){
9130  this.RemoveItem(this.hoverItems, name, postfixes);
9131  this.RemoveItem(this.focusedItems, name, postfixes);
9132 },
9133 RemovePressedItem: function(name, postfixes){
9134  this.RemoveItem(this.pressedItems, name, postfixes);
9135 },
9136 RemoveSelectedItem: function(name, postfixes){
9137  this.RemoveItem(this.selectedItems, name, postfixes);
9138 },
9139 RemoveDisabledItem: function (name, postfixes, rootId) {
9140  this.RemoveItem(this.disabledItems, name, postfixes, this.removeIdFromDisabledItemScheme, rootId);
9141 },
9142 RemoveItem: function (items, name, postfixes, onRemove, rootId) {
9143  if (postfixes && postfixes.length > 0) {
9144   for (var i = 0; i < postfixes.length; i++) {
9145    delete items[name + postfixes[i]];
9146    if (onRemove)
9147     onRemove.call(this, rootId, name + postfixes[i]);
9148   }
9149  }
9150  else {
9151   delete items[name];
9152   if (onRemove)
9153    onRemove.call(this, rootId, name);
9154  }
9155 },
9156 RemoveDisposedItems: function(){
9157  this.RemoveDisposedItemsByType(this.hoverItems);
9158  this.RemoveDisposedItemsByType(this.pressedItems);
9159  this.RemoveDisposedItemsByType(this.focusedItems);
9160  this.RemoveDisposedItemsByType(this.selectedItems);
9161  this.RemoveDisposedItemsByType(this.disabledItems);
9162  this.RemoveDisposedItemsByType(this.disabledScheme);
9163 },
9164 RemoveDisposedItemsByType: function(items){
9165  for(var key in items) {
9166   var item = items[key];
9167   var element = document.getElementById(key);
9168   if(!element || !ASPx.IsValidElement(element))
9169    delete items[key];
9170   try{
9171    if(item && item.elements) {
9172     for(var i = 0; i < item.elements.length; i++) {
9173      if(!ASPx.IsValidElements(item.links[i]))
9174       item.links[i] = null;
9175     }
9176    }
9177   }
9178   catch(e){
9179   }
9180  }
9181 },
9182 GetFocusedElement: function(srcElement){
9183  return this.GetItemElement(srcElement, this.focusedItems, ASPx.FocusedItemKind);
9184 },
9185 GetHoverElement: function(srcElement){
9186  return this.GetItemElement(srcElement, this.hoverItems, ASPx.HoverItemKind);
9187 },
9188 GetPressedElement: function(srcElement){
9189  return this.GetItemElement(srcElement, this.pressedItems, ASPx.PressedItemKind);
9190 },
9191 GetSelectedElement: function(srcElement){
9192  return this.GetItemElement(srcElement, this.selectedItems, ASPx.SelectedItemKind);
9193 },
9194 GetDisabledElement: function(srcElement){
9195  return this.GetItemElement(srcElement, this.disabledItems, ASPx.DisabledItemKind);
9196 },
9197 GetItemElement: function(srcElement, items, kind){
9198  if(srcElement && srcElement[ASPx.CachedStatePrefix + kind]){
9199   var cachedElement = srcElement[ASPx.CachedStatePrefix + kind];
9200   if(cachedElement != ASPx.EmptyObject)
9201    return cachedElement;
9202   return null;
9203  }
9204  var element = srcElement;
9205  while(element != null) {
9206   var item = items[element.id];
9207   if(item){
9208    this.CacheItemElement(srcElement, kind, element);
9209    element[kind] = item;
9210    return element;
9211   }
9212   element = element.parentNode;
9213  }
9214  this.CacheItemElement(srcElement, kind, ASPx.EmptyObject);
9215  return null;
9216 },
9217 CacheItemElement: function(srcElement, kind, value){
9218  if(srcElement && !srcElement[ASPx.CachedStatePrefix + kind])
9219   srcElement[ASPx.CachedStatePrefix + kind] = value;
9220 },
9221 DoSetFocusedState: function(element, fromElement){
9222  var item = element[ASPx.FocusedItemKind];
9223  if(item){
9224   var args = new ASPxClientStateEventArgs(item, element);
9225   args.fromElement = fromElement;
9226   this.BeforeSetFocusedState.FireEvent(this, args);
9227   item.Apply(element);
9228   this.AfterSetFocusedState.FireEvent(this, args);
9229  }
9230 },
9231 DoClearFocusedState: function(element, toElement){
9232  var item = element[ASPx.FocusedItemKind];
9233  if(item){
9234   var args = new ASPxClientStateEventArgs(item, element);
9235   args.toElement = toElement;
9236   this.BeforeClearFocusedState.FireEvent(this, args);
9237   item.Cancel(element);
9238   this.AfterClearFocusedState.FireEvent(this, args);
9239  }
9240 },
9241 DoSetHoverState: function(element, fromElement){
9242  var item = element[ASPx.HoverItemKind];
9243  if(item){
9244   var args = new ASPxClientStateEventArgs(item, element);
9245   args.fromElement = fromElement;
9246   this.BeforeSetHoverState.FireEvent(this, args);
9247   item.Apply(element);
9248   this.AfterSetHoverState.FireEvent(this, args);
9249  }
9250 },
9251 DoClearHoverState: function(element, toElement){
9252  var item = element[ASPx.HoverItemKind];
9253  if(item){
9254   var args = new ASPxClientStateEventArgs(item, element);
9255   args.toElement = toElement;
9256   this.BeforeClearHoverState.FireEvent(this, args);
9257   item.Cancel(element);
9258   this.AfterClearHoverState.FireEvent(this, args);
9259  }
9260 },
9261 DoSetPressedState: function(element){
9262  var item = element[ASPx.PressedItemKind];
9263  if(item){
9264   var args = new ASPxClientStateEventArgs(item, element);
9265   this.BeforeSetPressedState.FireEvent(this, args);
9266   item.Apply(element);
9267   this.AfterSetPressedState.FireEvent(this, args);
9268  }
9269 },
9270 DoClearPressedState: function(element){
9271  var item = element[ASPx.PressedItemKind];
9272  if(item){
9273   var args = new ASPxClientStateEventArgs(item, element);
9274   this.BeforeClearPressedState.FireEvent(this, args);
9275   item.Cancel(element);
9276   this.AfterClearPressedState.FireEvent(this, args);
9277  }
9278 },
9279 SetCurrentFocusedElement: function(element){
9280  if(this.currentFocusedElement && !ASPx.IsValidElement(this.currentFocusedElement)){
9281   this.currentFocusedElement = null;
9282   this.currentFocusedItemName = "";
9283  }
9284  if(this.currentFocusedElement != element){
9285   var oldCurrentFocusedElement = this.currentFocusedElement;
9286   var item = (element != null) ? element[ASPx.FocusedItemKind] : null;
9287   var itemName = (item != null) ? item.name : "";
9288   if(this.currentFocusedItemName != itemName){
9289    if(this.currentHoverItemName != "")
9290     this.SetCurrentHoverElement(null);
9291    if(this.currentFocusedElement != null)
9292     this.DoClearFocusedState(this.currentFocusedElement, element);
9293    this.currentFocusedElement = element;
9294    item = (element != null) ? element[ASPx.FocusedItemKind] : null;
9295    this.currentFocusedItemName = (item != null) ? item.name : "";
9296    if(this.currentFocusedElement != null)
9297     this.DoSetFocusedState(this.currentFocusedElement, oldCurrentFocusedElement);
9298   }
9299  }
9300 },
9301 SetCurrentHoverElement: function(element){
9302  if(this.currentHoverElement && !ASPx.IsValidElement(this.currentHoverElement)){
9303   this.currentHoverElement = null;
9304   this.currentHoverItemName = "";
9305  }
9306  var item = (element != null) ? element[ASPx.HoverItemKind] : null;
9307  if(item && !item.enabled) { 
9308   element = this.GetItemElement(element.parentNode, this.hoverItems, ASPx.HoverItemKind);
9309   item = (element != null) ? element[ASPx.HoverItemKind] : null;
9310  }
9311  if(this.currentHoverElement != element){
9312   var oldCurrentHoverElement = this.currentHoverElement,
9313    itemName = (item != null) ? item.name : "";
9314   if(this.currentHoverItemName != itemName || (item != null && item.needRefreshBetweenElements)){
9315    if(this.currentHoverElement != null)
9316     this.DoClearHoverState(this.currentHoverElement, element);
9317    item = (element != null) ? element[ASPx.HoverItemKind] : null;
9318    if(item == null || item.enabled){
9319     this.currentHoverElement = element;
9320     this.currentHoverItemName = (item != null) ? item.name : "";
9321     if(this.currentHoverElement != null)
9322      this.DoSetHoverState(this.currentHoverElement, oldCurrentHoverElement);
9323    }
9324   }
9325  }
9326 },
9327 SetCurrentPressedElement: function(element){
9328  if(this.currentPressedElement && !ASPx.IsValidElement(this.currentPressedElement)){
9329   this.currentPressedElement = null;
9330   this.currentPressedItemName = "";
9331  }
9332  if(this.currentPressedElement != element){
9333   if(this.currentPressedElement != null)
9334    this.DoClearPressedState(this.currentPressedElement);
9335   var item = (element != null) ? element[ASPx.PressedItemKind] : null;
9336   if(item == null || item.enabled){
9337    this.currentPressedElement = element;
9338    this.currentPressedItemName = (item != null) ? item.name : "";
9339    if(this.currentPressedElement != null)
9340     this.DoSetPressedState(this.currentPressedElement);
9341   }
9342  }
9343 },
9344 SetCurrentFocusedElementBySrcElement: function(srcElement){
9345  var element = this.GetFocusedElement(srcElement);
9346  this.SetCurrentFocusedElement(element);
9347 },
9348 SetCurrentHoverElementBySrcElement: function(srcElement){
9349  var element = this.GetHoverElement(srcElement);
9350  this.SetCurrentHoverElement(element);
9351 },
9352 SetCurrentPressedElementBySrcElement: function(srcElement){
9353  var element = this.GetPressedElement(srcElement);
9354  this.SetCurrentPressedElement(element);
9355 },
9356 SetPressedElement: function (element) {
9357  this.SetCurrentHoverElement(null);
9358  this.SetCurrentPressedElementBySrcElement(element);
9359  this.savedCurrentPressedElement = this.currentPressedElement;
9360 },
9361 SelectElement: function (element) {
9362  var item = element[ASPx.SelectedItemKind];
9363  if(item)
9364   item.Apply(element);
9365 }, 
9366 SelectElementBySrcElement: function(srcElement){
9367  var element = this.GetSelectedElement(srcElement);
9368  if(element != null) this.SelectElement(element);
9369 }, 
9370 DeselectElement: function(element){
9371  var item = element[ASPx.SelectedItemKind];
9372  if(item)
9373   item.Cancel(element);
9374 }, 
9375 DeselectElementBySrcElement: function(srcElement){
9376  var element = this.GetSelectedElement(srcElement);
9377  if(element != null) this.DeselectElement(element);
9378 },
9379 SetElementEnabled: function(element, enable){
9380  if(enable)
9381   this.EnableElement(element);
9382  else
9383   this.DisableElement(element);
9384 },
9385 SetElementWithChildNodesEnabled: function (parentName, enabled) {
9386  var procFunct = (enabled ? this.EnableElement : this.DisableElement);
9387  var childItems = this.disabledScheme[parentName];
9388  if (childItems && childItems.length > 0)
9389   for (var i = 0; i < childItems.length; i++) {
9390    procFunct.call(this, document.getElementById(childItems[i]));
9391   }
9392 },
9393 DisableElement: function (element) {
9394  var element = this.GetDisabledElement(element);
9395  if(element != null) {
9396   var item = element[ASPx.DisabledItemKind];
9397   if(item){
9398    var args = new ASPxClientStateEventArgs(item, element);
9399    this.BeforeDisabled.FireEvent(this, args);
9400    if(item.name == this.currentPressedItemName)
9401     this.SetCurrentPressedElement(null);
9402    if(item.name == this.currentHoverItemName)
9403     this.SetCurrentHoverElement(null);
9404    item.Apply(element);
9405    this.SetMouseStateItemsEnabled(item.name, item.postfixes, false);
9406    this.AfterDisabled.FireEvent(this, args);
9407   }
9408  }
9409 }, 
9410 EnableElement: function(element){
9411  var element = this.GetDisabledElement(element);
9412  if(element != null) {
9413   var item = element[ASPx.DisabledItemKind];
9414   if(item){
9415    var args = new ASPxClientStateEventArgs(item, element);
9416    this.BeforeEnabled.FireEvent(this, args);
9417    item.Cancel(element);
9418    this.SetMouseStateItemsEnabled(item.name, item.postfixes, true);
9419    this.AfterEnabled.FireEvent(this, args);
9420   }
9421  }
9422 }, 
9423 SetMouseStateItemsEnabled: function(name, postfixes, enabled){   
9424  if(postfixes && postfixes.length > 0){
9425   for(var i = 0; i < postfixes.length; i ++){
9426    this.SetItemsEnabled(this.hoverItems, name + postfixes[i], enabled);
9427    this.SetItemsEnabled(this.pressedItems, name + postfixes[i], enabled);
9428    this.SetItemsEnabled(this.focusedItems, name + postfixes[i], enabled);
9429   }
9430  }
9431  else{
9432   this.SetItemsEnabled(this.hoverItems, name, enabled);
9433   this.SetItemsEnabled(this.pressedItems, name, enabled);
9434   this.SetItemsEnabled(this.focusedItems, name, enabled);
9435  }  
9436 },
9437 SetItemsEnabled: function(items, name, enabled){   
9438  if(items[name])
9439   items[name].enabled = enabled;
9440 },
9441 OnFocusMove: function(evt){
9442  var element = ASPx.Evt.GetEventSource(evt);
9443  aspxGetStateController().SetCurrentFocusedElementBySrcElement(element);
9444 },
9445 OnMouseMove: function(evt, checkElementChanged){
9446  var srcElement = ASPx.Evt.GetEventSource(evt);
9447  if(checkElementChanged && srcElement == this.savedCurrentMouseMoveSrcElement) return;
9448  this.savedCurrentMouseMoveSrcElement = srcElement;
9449  if(ASPx.Browser.IE && !ASPx.Evt.IsLeftButtonPressed(evt) && this.savedCurrentPressedElement != null)
9450   this.ClearSavedCurrentPressedElement();
9451  if(this.savedCurrentPressedElement == null)
9452   this.SetCurrentHoverElementBySrcElement(srcElement);
9453  else{
9454   var element = this.GetPressedElement(srcElement);
9455   if(element != this.currentPressedElement){
9456    if(element == this.savedCurrentPressedElement)
9457     this.SetCurrentPressedElement(this.savedCurrentPressedElement);
9458    else
9459     this.SetCurrentPressedElement(null);
9460   }
9461  }
9462 },
9463 OnMouseDown: function(evt){
9464  if(!ASPx.Evt.IsLeftButtonPressed(evt)) return;
9465  var srcElement = ASPx.Evt.GetEventSource(evt);
9466  this.OnMouseDownOnElement(srcElement);
9467 },
9468 OnMouseDownOnElement: function (element) {
9469  if(this.GetPressedElement(element) == null) return;
9470  this.SetPressedElement(element);
9471 },
9472 OnMouseUp: function(evt){
9473  var srcElement = ASPx.Evt.GetEventSource(evt);
9474  this.OnMouseUpOnElement(srcElement);
9475 },
9476 OnMouseUpOnElement: function(element){
9477  if(this.savedCurrentPressedElement == null) return;
9478  this.ClearSavedCurrentPressedElement();
9479  this.SetCurrentHoverElementBySrcElement(element);
9480 },
9481 OnMouseOver: function(evt){
9482  var element = ASPx.Evt.GetEventSource(evt);
9483  if(element && element.tagName == "IFRAME")
9484   this.OnMouseMove(evt, true);
9485 },
9486 OnKeyDown: function(evt){
9487  var element = this.GetFocusedElement(ASPx.Evt.GetEventSource(evt));
9488  if(element != null && element == this.currentFocusedElement) {
9489   var item = element[ASPx.FocusedItemKind];
9490   if(item){
9491    var args = new ASPxClientStateEventArgs(item, element);
9492    args.htmlEvent = evt;
9493    this.FocusedItemKeyDown.FireEvent(this, args);
9494   }
9495  }
9496 },
9497 OnSelectStart: function(evt){
9498  if(this.savedCurrentPressedElement) {
9499   ASPx.Selection.Clear();
9500   return false;
9501  }
9502 },
9503 ClearSavedCurrentPressedElement: function() {
9504  this.savedCurrentPressedElement = null;
9505  this.SetCurrentPressedElement(null);
9506 },
9507 ClearCache: function(srcElement, kind) {
9508  if(srcElement[ASPx.CachedStatePrefix + kind])
9509   srcElement[ASPx.CachedStatePrefix + kind] = null;
9510 },
9511 ClearElementCache: function(srcElement) {
9512  this.ClearCache(srcElement, ASPx.FocusedItemKind);
9513  this.ClearCache(srcElement, ASPx.HoverItemKind);
9514  this.ClearCache(srcElement, ASPx.PressedItemKind);
9515  this.ClearCache(srcElement, ASPx.SelectedItemKind);
9516  this.ClearCache(srcElement, ASPx.DisabledItemKind);
9517 },
9518 LockForceRedrawAppearance: function() {
9519  this.forceRedrawAppearanceLockCount++;
9520 },
9521 UnlockForceRedrawAppearance: function() {
9522  this.forceRedrawAppearanceLockCount--;
9523 },
9524 IsForceRedrawAppearanceLocked: function() {
9525  return this.forceRedrawAppearanceLockCount > 0;
9526 }
9527});
9528var stateController = null;
9529function aspxGetStateController(){
9530 if(stateController == null)
9531  stateController = new ASPxStateController();
9532 return stateController;
9533}
9534function aspxAddStateItems(method, namePrefix, classes, disableApplyingStyleToLink){
9535 for(var i = 0; i < classes.length; i ++){
9536  for(var j = 0; j < classes[i][2].length; j ++) {
9537   var name = namePrefix;
9538   if(classes[i][2][j])
9539    name += "_" + classes[i][2][j];
9540   var postfixes = classes[i][3] || null;
9541   var imag
9541eObjs = (classes[i][4] && classes[i][4][j]) || null;
9542   var imagePostfixes = classes[i][5] || null;
9543   method.call(aspxGetStateController(), name, classes[i][0], classes[i][1], postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink, namePrefix);
9544  }
9545 }
9546}
9547ASPx.AddHoverItems = function(namePrefix, classes, disableApplyingStyleToLink){
9548 aspxAddStateItems(aspxGetStateController().AddHoverItem, namePrefix, classes, disableApplyingStyleToLink);
9549}
9550ASPx.AddPressedItems = function(namePrefix, classes, disableApplyingStyleToLink){
9551 aspxAddStateItems(aspxGetStateController().AddPressedItem, namePrefix, classes, disableApplyingStyleToLink);
9552}
9553ASPx.AddSelectedItems = function(namePrefix, classes, disableApplyingStyleToLink){
9554 aspxAddStateItems(aspxGetStateController().AddSelectedItem, namePrefix, classes, disableApplyingStyleToLink);
9555}
9556ASPx.AddDisabledItems = function(namePrefix, classes, disableApplyingStyleToLink){
9557 aspxAddStateItems(aspxGetStateController().AddDisabledItem, namePrefix, classes, disableApplyingStyleToLink);
9558}
9559function aspxRemoveStateItems(method, namePrefix, classes){
9560 for(var i = 0; i < classes.length; i ++){
9561  for(var j = 0; j < classes[i][0].length; j ++) {
9562   var name = namePrefix;
9563   if(classes[i][0][j])
9564    name += "_" + classes[i][0][j];
9565   method.call(aspxGetStateController(), name, classes[i][1], namePrefix);
9566  }
9567 }
9568}
9569ASPx.RemoveHoverItems = function(namePrefix, classes){
9570 aspxRemoveStateItems(aspxGetStateController().RemoveHoverItem, namePrefix, classes);
9571}
9572ASPx.RemovePressedItems = function(namePrefix, classes){
9573 aspxRemoveStateItems(aspxGetStateController().RemovePressedItem, namePrefix, classes);
9574}
9575ASPx.RemoveSelectedItems = function(namePrefix, classes){
9576 aspxRemoveStateItems(aspxGetStateController().RemoveSelectedItem, namePrefix, classes);
9577}
9578ASPx.RemoveDisabledItems = function(namePrefix, classes){
9579 aspxRemoveStateItems(aspxGetStateController().RemoveDisabledItem, namePrefix, classes);
9580}
9581ASPx.AddAfterClearFocusedState = function(handler){
9582 aspxGetStateController().AfterClearFocusedState.AddHandler(handler);
9583}
9584ASPx.AddAfterSetFocusedState = function(handler){
9585 aspxGetStateController().AfterSetFocusedState.AddHandler(handler);
9586}
9587ASPx.AddAfterClearHoverState = function(handler){
9588 aspxGetStateController().AfterClearHoverState.AddHandler(handler);
9589}
9590ASPx.AddAfterSetHoverState = function(handler){
9591 aspxGetStateController().AfterSetHoverState.AddHandler(handler);
9592}
9593ASPx.AddAfterClearPressedState = function(handler){
9594 aspxGetStateController().AfterClearPressedState.AddHandler(handler);
9595}
9596ASPx.AddAfterSetPressedState = function(handler){
9597 aspxGetStateController().AfterSetPressedState.AddHandler(handler);
9598}
9599ASPx.AddAfterDisabled = function(handler){
9600 aspxGetStateController().AfterDisabled.AddHandler(handler);
9601}
9602ASPx.AddAfterEnabled = function(handler){
9603 aspxGetStateController().AfterEnabled.AddHandler(handler);
9604}
9605ASPx.AddBeforeClearFocusedState = function(handler){
9606 aspxGetStateController().BeforeClearFocusedState.AddHandler(handler);
9607}
9608ASPx.AddBeforeSetFocusedState = function(handler){
9609 aspxGetStateController().BeforeSetFocusedState.AddHandler(handler);
9610}
9611ASPx.AddBeforeClearHoverState = function(handler){
9612 aspxGetStateController().BeforeClearHoverState.AddHandler(handler);
9613}
9614ASPx.AddBeforeSetHoverState = function(handler){
9615 aspxGetStateController().BeforeSetHoverState.AddHandler(handler);
9616}
9617ASPx.AddBeforeClearPressedState = function(handler){
9618 aspxGetStateController().BeforeClearPressedState.AddHandler(handler);
9619}
9620ASPx.AddBeforeSetPressedState = function(handler){
9621 aspxGetStateController().BeforeSetPressedState.AddHandler(handler);
9622}
9623ASPx.AddBeforeDisabled = function(handler){
9624 aspxGetStateController().BeforeDisabled.AddHandler(handler);
9625}
9626ASPx.AddBeforeEnabled = function(handler){
9627 aspxGetStateController().BeforeEnabled.AddHandler(handler);
9628}
9629ASPx.AddFocusedItemKeyDown = function(handler){
9630 aspxGetStateController().FocusedItemKeyDown.AddHandler(handler);
9631}
9632ASPx.SetHoverState = function(element){
9633 aspxGetStateController().SetCurrentHoverElementBySrcElement(element);
9634}
9635ASPx.ClearHoverState = function(evt){
9636 aspxGetStateController().SetCurrentHoverElementBySrcElement(null);
9637}
9638ASPx.UpdateHoverState = function(evt){
9639 aspxGetStateController().OnMouseMove(evt, false);
9640}
9641ASPx.SetFocusedState = function(element){
9642 aspxGetStateController().SetCurrentFocusedElementBySrcElement(element);
9643}
9644ASPx.ClearFocusedState = function(evt){
9645 aspxGetStateController().SetCurrentFocusedElementBySrcElement(null);
9646}
9647ASPx.UpdateFocusedState = function(evt){
9648 aspxGetStateController().OnFocusMove(evt);
9649}
9650ASPx.AccessibilityMarkerClass = "dxalink";
9651ASPx.AssignAccessibilityEventsToChildrenLinks = function(container, clearFocusedStateOnMouseOut){
9652 var links = ASPx.GetNodesByPartialClassName(container, ASPx.AccessibilityMarkerClass);
9653 for(var i = 0; i < links.length; i++)
9654  ASPx.AssignAccessibilityEventsToLink(links[i], clearFocusedStateOnMouseOut);
9655}
9656ASPx.AssignAccessibilityEventsToLink = function(link, clearFocusedStateOnMouseOut) {
9657 if(!ASPx.ElementContainsCssClass(link, ASPx.AccessibilityMarkerClass))
9658  return;
9659 ASPx.Evt.AttachEventToElement(link, "focus", function(e) { ASPx.UpdateFocusedState(e); });
9660 var clearFocusedStateHandler = function(e) { ASPx.ClearFocusedState(e); };
9661 ASPx.Evt.AttachEventToElement(link, "blur", clearFocusedStateHandler);
9662 if(clearFocusedStateOnMouseOut)
9663  ASPx.Evt.AttachEventToElement(link, "mouseout", clearFocusedStateHandler);
9664}
9665ASPx.Evt.AttachEventToDocument("mousemove", function(evt) {
9666 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
9667  aspxGetStateController().OnMouseMove(evt, true);
9668});
9669ASPx.Evt.AttachEventToDocument(ASPx.TouchUIHelper.touchMouseDownEventName, function(evt) {
9670 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
9671  aspxGetStateController().OnMouseDown(evt);
9672});
9673ASPx.Evt.AttachEventToDocument(ASPx.TouchUIHelper.touchMouseUpEventName, function(evt) {
9674 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
9675  aspxGetStateController().OnMouseUp(evt);
9676});
9677ASPx.Evt.AttachEventToDocument("mouseover", function(evt) {
9678 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
9679  aspxGetStateController().OnMouseOver(evt);
9680});
9681ASPx.Evt.AttachEventToDocument("keydown", function(evt) {
9682 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
9683  aspxGetStateController().OnKeyDown(evt);
9684});
9685ASPx.Evt.AttachEventToDocument("selectstart", function(evt) {
9686 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
9687  return aspxGetStateController().OnSelectStart(evt);
9688});
9689ASPx.GetStateController = aspxGetStateController;
9690})();
9691(function () {
9692 if (typeof ASPx == "undefined") {
9693  window.ASPx = {};
9694 }
9695 ASPx.ASPxImageLoad = {};
9696 ASPx.ASPxImageLoad.dxDefaultLoadingImageCssClass = "dxe-loadingImage";
9697 ASPx.ASPxImageLoad.OnLoad = function (image, customLoadingImage, isOldIE, customBackgroun
9697dImageUrl) {
9698  image.dxCustomBackgroundImageUrl = "";
9699  image.dxShowLoadingImage = true;
9700  image.dxCustomLoadingImage = customLoadingImage;
9701  if (customBackgroundImageUrl != "")
9702   image.dxCustomBackgroundImageUrl = "url('" + customBackgroundImageUrl + "')";
9703  ASPx.ASPxImageLoad.prepareImageBackground(image, isOldIE);
9704  ASPx.ASPxImageLoad.removeHandlers(image);
9705  image.className = image.className.replace(ASPx.ASPxImageLoad.dxDefaultLoadingImageCssClass, "");
9706 };
9707 ASPx.ASPxImageLoad.removeASPxImageBackground = function (image, isOldIE) {
9708  if (isOldIE) 
9709   image.style.removeAttribute("background-image");
9710  else 
9711   image.style.backgroundImage = "";
9712 };
9713 ASPx.ASPxImageLoad.prepareImageBackground = function (image, isOldIE) {
9714  ASPx.ASPxImageLoad.removeASPxImageBackground(image, isOldIE);
9715  if (image.dxCustomBackgroundImageUrl != "")
9716   image.style.backgroundImage = image.dxCustomBackgroundImageUrl;
9717 };
9718 ASPx.ASPxImageLoad.removeHandlers = function (image) {
9719  image.removeAttribute("onload");
9720  image.removeAttribute("onabort");
9721  image.removeAttribute("onerror");
9722 };
9723})();
9724(function () {
9725var ASPxClientBeginCallbackEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
9726 constructor: function(command){
9727  this.constructor.prototype.constructor.call(this);
9728  this.command = command;
9729 }
9730});
9731var ASPxClientGlobalBeginCallbackEventArgs = ASPx.CreateClass(ASPxClientBeginCallbackEventArgs, {
9732 constructor: function(control, command){
9733  this.constructor.prototype.constructor.call(this, command);
9734  this.control = control;
9735 }
9736});
9737var ASPxClientEndCallbackEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
9738 constructor: function(){
9739  this.constructor.prototype.constructor.call(this);
9740 }
9741});
9742var ASPxClientGlobalEndCallbackEventArgs = ASPx.CreateClass(ASPxClientEndCallbackEventArgs, {
9743 constructor: function(control){
9744  this.constructor.prototype.constructor.call(this);
9745  this.control = control;
9746 }
9747});
9748var ASPxClientCustomDataCallbackEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
9749 constructor: function(result) {
9750  this.constructor.prototype.constructor.call(this);
9751  this.result = result;
9752 }
9753});
9754var ASPxClientCallbackErrorEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
9755 constructor: function (message, callbackId) {
9756  this.constructor.prototype.constructor.call(this);
9757  this.message = message;
9758  this.handled = false;
9759  this.callbackId = callbackId;
9760 }
9761});
9762var ASPxClientGlobalCallbackErrorEventArgs = ASPx.CreateClass(ASPxClientCallbackErrorEventArgs, {
9763 constructor: function (control, message, callbackId) {
9764  this.constructor.prototype.constructor.call(this, message, callbackId);
9765  this.control = control;
9766 }
9767});
9768var ASPxClientValidationCompletedEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
9769 constructor: function (container, validationGroup, invisibleControlsValidated, isValid, firstInvalidControl, firstVisibleInvalidControl) {
9770  this.constructor.prototype.constructor.call(this);
9771  this.container = container;
9772  this.validationGroup = validationGroup;
9773  this.invisibleControlsValidated = invisibleControlsValidated;
9774  this.isValid = isValid;
9775  this.firstInvalidControl = firstInvalidControl;
9776  this.firstVisibleInvalidControl = firstVisibleInvalidControl;
9777 }
9778});
9779var ASPxClientControlsInitializedEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
9780 constructor: function(isCallback) {
9781  this.isCallback = isCallback;
9782 }
9783});
9784var ASPxClientControlBeforePronounceEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
9785 constructor: function(messageParts, control){
9786  this.constructor.prototype.constructor.call(this);
9787  this.messageParts = messageParts;
9788  this.control = control;
9789 }
9790});
9791var BeforeInitCallbackEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
9792 constructor: function(callbackOwnerID){
9793  this.constructor.prototype.constructor.call(this);
9794  this.callbackOwnerID = callbackOwnerID;
9795 }
9796});
9797var ASPxClientControlBase = ASPx.CreateClass(null, {
9798 constructor: function(name){
9799  this.name = name;
9800  this.uniqueID = name;   
9801  this.globalName = name;
9802  this.stateObject = null;
9803  this.encodeHtml = true;
9804  this.enabled = true;
9805  this.clientEnabled = true;
9806  this.savedClientEnabled = true;
9807  this.clientVisible = true;
9808  this.accessibilityCompliant = false;
9809  this.autoPostBack = false;
9810  this.allowMultipleCallbacks = true;
9811  this.callBack = null;
9812  this.enableCallbackAnimation = false;
9813  this.enableSlideCallbackAnimation = false;
9814  this.slideAnimationDirection = null;
9815  this.beginCallbackAnimationProcessing = false;
9816  this.endCallbackAnimationProcessing = false;
9817  this.savedCallbackResult = null;
9818  this.savedCallbacks = null;
9819  this.isCallbackAnimationPrevented = false;
9820  this.lpDelay = 300;
9821  this.lpTimer = -1;
9822  this.requestCount = 0;
9823  this.enableSwipeGestures = false;
9824  this.disableSwipeGestures = false;
9825  this.supportGestures = false;
9826  this.repeatedGestureValue = 0;
9827  this.repeatedGestureCount = 0;
9828  this.isInitialized = false;
9829  this.initialFocused = false;
9830  this.leadingAfterInitCall = ASPxClientControl.LeadingAfterInitCallConsts.None; 
9831  this.serverEvents = [];
9832  this.loadingPanelElement = null;
9833  this.loadingDivElement = null;  
9834  this.hasPhantomLoadingElements = false;
9835  this.mainElement = null;
9836  this.touchUIMouseScroller = null;
9837  this.hiddenFields = { };
9838  this.callbackHandlersQueue = new ASPx.ControlCallbackHandlersQueue(this);
9839  this.Init = new ASPxClientEvent();
9840  this.BeginCallback = new ASPxClientEvent();
9841  this.EndCallback = new ASPxClientEvent();
9842  this.EndCallbackAnimationStart = new ASPxClientEvent();
9843  this.CallbackError = new ASPxClientEvent();
9844  this.CustomDataCallback = new ASPxClientEvent();
9845  this.BeforePronounce = new ASPxClientEvent();
9846  aspxGetControlCollection().Add(this);
9847 },
9848 Initialize: function() {
9849  if(this.callBack != null)
9850   this.InitializeCallBackData();
9851  if (this.useCallbackQueue())
9852   this.callbackQueueHelper = new ASPx.ControlCallbackQueueHelper(this);
9853  ASPx.AccessibilityUtils.createAccessibleBackgrounds(this);
9854  if(this.accessibilityCompliant)
9855   ASPx.AccessibilityPronouncer.EnsureInitialize();
9856 },
9857 InlineInitialize: function() {
9858  this.savedClientEnabled = this.clientEnabled;
9859 },
9860 InitializeGestures: function() {
9861  if(this.isSwipeGesturesEnabled() && this.supportGestures) {
9862   ASPx.GesturesHelper.AddSwipeGestureHandler(this.name, 
9863    function() { return this.GetCallbackAnimationElement(); }.aspxBind(this), 
9864    function(evt) { return this.CanHandleGestureCore(evt); }.aspxBind(this), 
9865    function(value) { return this.AllowStartGesture(); }.aspxBind(this),
9866    function(value) { return this.StartGesture(); }.aspxBind(this),
9867    function(value) { return this.AllowExecuteGesture(value); }.aspxBind(this),
9868    function(value) { this.ExecuteGesture(value); }.aspxBind(this),
9869    function(value) { this.CancelGesture(value); }.aspxBind(this),
9870    this.GetDefaultanimationEngineType()
9871   );
9872   if(ASPx.Browser.MSTouchUI)
9873    this.touchUIMouseScroller = ASPx.MouseScroller.Create(
9874     function() { return this.GetCallbackAnimationElement(); }.aspxBind(this),
9875     function() { return null; },
9876     function() { return this.GetCallbackAnimationElement(); }.aspxBind(this),
9877     function(element) { return this.NeedPreventTouchUIMouseScrolling(element); }.aspxBind(this),
9878     true
9879    );
9880  }
9881 },
9882 isSwipeGesturesEnabled: function() {
9883  return !this.disableSwipeGestures && (this.enableSwipeGestures || ASPx.Browser.TouchUI);
9884 },
9885 isSlideCallbackAnimationEnabled: function() {
9886  return this.enableSlideCallbackAnimation || this.isSwipeGesturesEnabled(); 
9887 },
9888 InitGlobalVariable: function(varName){
9889  if(!window) return;
9890  this.globalName = varName;
9891  window[varName] = this;
9892 },
9893 SetProperties: function(properties, obj){
9894  if(!obj) obj = this;
9895  for(var name in properties){
9896   if(properties.hasOwnProperty(name))
9897    obj[name] = properties[name];
9898  }
9899 },
9900 SetEvents: function(events, obj){
9901  if(!obj) obj = this;
9902  for(var name in events){
9903   if(events.hasOwnProperty(name) && obj[name] && obj[name].AddHandler)
9904    obj[name].AddHandler(events[name]);
9905  }
9906 },
9907 InitializeProperties: function(properties){
9908 },
9909 useCallbackQueue: function(){
9910  return false;
9911 },
9912 NeedPreventTouchUIMouseScrolling: function(element) {
9913  return false;
9914 },
9915 InitailizeFocus: function() {
9916  if(this.initialFocused && this.IsVisible())
9917   this.Focus();
9918 },
9919 AfterCreate: function() { 
9920  this.InlineInitialize();
9921  this.InitializeGestures();
9922 },
9923 AfterInitialize: function() {
9924  this.initializeAriaDescriptor();
9925  this.InitailizeFocus();
9926  this.isInitialized = true;
9927  this.RaiseInit();
9928  if(this.savedCallbacks) {
9929   for(var i = 0; i < this.savedCallbacks.length; i++) 
9930    this.CreateCallbackInternal(this.savedCallbacks[i].arg, this.savedCallbacks[i].command, 
9931     false, this.savedCallbacks[i].callbackInfo);
9932   this.savedCallbacks = null;
9933  }
9934 },
9935 InitializeCallBackData: function() {
9936 },
9937 IsDOMDisposed: function() { 
9938  return !ASPx.IsExistsElement(this.GetMainElement());
9939 },
9940 initializeAriaDescriptor: function() {
9941  if(this.ariaDescription) {
9942   var descriptionObject = ASPx.Json.Eval(this.ariaDescription)
9943   if(descriptionObject) {
9944    this.ariaDescriptor = new AriaDescriptor(this, descriptionObject);
9945    this.applyAccessibilityAttributes(this.ariaDescriptor); 
9946   }
9947  }
9948 },
9949 applyAccessibilityAttributes: function() { },
9950 setAriaDescription: function(selector, argsList) {
9951  if(this.ariaDescriptor)
9952   this.ariaDescriptor.setDescription(selector, argsList || [[]]);
9953 },
9954 allowRestoreFocusOnCallbacks: function(){
9955  return this.accessibilityCompliant;
9956 },
9957 HtmlEncode: function(text) {
9958  return this.encodeHtml ? ASPx.Str.EncodeHtml(text) : text;
9959 },
9960 IsServerEventAssigned: function(eventName){
9961  return ASPx.Data.ArrayIndexOf(this.serverEvents, eventName) >= 0;
9962 },
9963 OnPost: function(args){
9964  this.UpdateStateObject();
9965  if(this.stateObject != null) 
9966   this.UpdateStateHiddenField();
9967 },
9968 OnPostFinalization: function(args){
9969 },
9970 UpdateStateObject: function(){
9971 },
9972 UpdateStateObjectWithObject: function(obj){
9973  if(!obj) return;
9974  if(!this.stateObject)
9975   this.stateObject = { };
9976  for(var key in obj)
9977   this.stateObject[key] = obj[key];
9978 },
9979 UpdateStateHiddenField: function(){
9980  var stateHiddenField = this.GetStateHiddenField()
9981  if(stateHiddenField) {
9982   var stateObjectStr = ASPx.Json.ToJson(this.stateObject);
9983   stateHiddenField.value = ASPx.Str.EncodeHtml(stateObjectStr);
9984  }
9985 },
9986 GetStateHiddenField: function() {
9987  return this.GetHiddenField(this.GetStateHiddenFieldName(), this.GetStateHiddenFieldID(), 
9988   this.GetStateHiddenFieldParent(), this.GetStateHiddenFieldOrigin());
9989 },
9990 GetStateHiddenFieldName: function() {
9991  return this.uniqueID;
9992 },
9993 GetStateHiddenFieldID: function() {
9994  return this.name + "_State";
9995 },
9996 GetStateHiddenFieldOrigin: function() {
9997  return this.GetMainElement();
9998 },
9999 GetStateHiddenFieldParent: function() {
10000  var element = this.GetStateHiddenFieldOrigin();
10001  return element ? element.parentNode : null;
10002 },
10003 GetHiddenField: function(name, id, parent, beforeElement) {
10004  var hiddenField = this.hiddenFields[id];
10005  if(!hiddenField || !ASPx.IsValidElement(hiddenField)) {
10006   if(parent) {
10007    var existingHiddenField = ASPx.GetElementById(this.GetStateHiddenFieldID());
10008    this.hiddenFields[id] = hiddenField = existingHiddenField || ASPx.CreateHiddenField(name, id);
10009    if(existingHiddenField)
10010     return existingHiddenField;
10011    if(beforeElement)
10012     parent.insertBefore(hiddenField, beforeElement)
10013    else
10014     parent.appendChild(hiddenField);
10015   }
10016  }
10017  return hiddenField;
10018 },
10019 GetChildElement: function(idPostfix){
10020  var mainElement = this.GetMainElement();
10021  if(idPostfix.charAt && idPostfix.charAt(0) !== "_")
10022   idPostfix = "_" + idPostfix;
10023  return mainElement ? ASPx.CacheHelper.GetCachedChildById(this, mainElement, this.name + idPostfix) : null;
10024 },
10025 getChildControl: function(idPostfix) {
10026  var result = null;
10027  var childControlId = this.getChildControlUniqueID(idPostfix);
10028  ASPx.GetControlCollection().ProcessControlsInContainer(this.GetMainElement(), function(control) {
10029   if(control.uniqueID == childControlId)
10030    result = control;
10031  });
10032  return result;  
10033 },
10034 getChildControlUniqueID: function(idPostfix) {
10035  idPostfix = idPostfix.split("_").join("$");
10036  if(idPostfix.charAt && idPostfix.charAt(0) !== "$")
10037   idPostfix = "$" + idPostfix;
10038  return this.uniqueID + idPostfix;  
10039 },
10040 getInnerControl: function(idPostfix) {
10041  var name = this.name + idPostfix;
10042  var result = window[name];
10043  return result && Ident.IsASPxClientControl(result)
10044   ? result
10045   : null;
10046 },
10047 GetParentForm: function(){
10048  return ASPx.GetParentByTagName(this.GetMainElement(), "FORM");
10049 },
10050 GetMainElement: function(){
10051  if(!ASPx.IsExistsElement(this.mainElement))
10052   this.mainElement = ASPx.GetElementById(this.name);
10053  return this.mainElement;
10054 },
10055 IsLoadingContainerVisible: function(){
10056  return this.IsVisible();
10057 },
10058 GetLoadingPanelElement: function(){
10059  return ASPx.GetElementById(this.name + "_LP");
10060 },
10061 GetClonedLoadingPanel: function(){
10062  return document.getElementById(this.GetLoadingPanelElement().id + "V"); 
10063 },
10064 CloneLoadingPanel: function(element, parent) {
10065  var clone = element.cloneNode(true);
10066  clone.id = element.id + "V";
10067  parent.appendChild(clone);
10068  return clone;
10069 },
10070 CreateLoadingPanelWithoutBordersInsideContainer: function(container) {
10071  var loadingPanel = this.CreateLoadingPanelInsideContainer(container, false, true, true);
10072  var contentStyle = ASPx.GetCurrentStyle(container);
10073  if(!loadingPanel || !contentStyle)
10074   return;
10075  var elements = [ ];
10076  var table = (loadingPanel.tagName == "TABLE") ? loadingPanel : ASPx.GetNodeByTagName(loadingPanel, "TABLE", 0);
10077  if(table != null)
10078   elements.push(table);
10079  else
10080   elements.push(loadingPanel);
10081  var cells = ASPx.GetNodesByTagName(loadingPanel, "TD");
10082  if(!cells) cells = [ ];
10083  for(var i = 0; i < cells.length; i++)
10084   elements.push(cells[i]);
10085  for(var i = 0; i < elements.length; i++) {
10086   var el = elements[i];
10087   el.style.backgroundColor = contentStyle.backgroundColor;
10088   ASPx.RemoveBordersAndShadows(el);
10089  }
10090 },
10091 CreateLoadingPanelInsideContainer: function(parentElement, hideContent, collapseHeight, collapseWidth) {
10092  if(this.ShouldHideExistingLoadingElements())
10093   this.HideLoadingPanel();
10094  if(parentElement == null)
10095   return null;
10096  if(!this.IsLoadingContainerVisible()) {
10097   this.hasPhantomLoadingElements = true;
10098   return null;
10099  }
10100  var element = this.GetLoadingPanelElement();
10101  if(element != null){
10102   var width = collapseWidth ? 0 : ASPx.GetClearClientWidth(parentElement);
10103   var height = collapseHeight ? 0 : ASPx.GetClearClientHeight(parentElement);
10104   if(hideContent){
10105    for(var i = parentElement.childNodes.length - 1; i > -1; i--){
10106     if(parentElement.childNodes[i].style)
10107      parentElement.childNodes[i].style.display = "none";
10108     else if(parentElement.childNodes[i].nodeType == 3) 
10109      parentElement.removeChild(parentElement.childNodes[i]);
10110    }
10111   }
10112   else
10113    parentElement.innerHTML = "";
10114   var table = document.createElement("TABLE");
10115   parentElement.appendChild(table);
10116   table.border = 0;
10117   table.cellPadding = 0;
10118   table.cellSpacing = 0;
10119   ASPx.SetStyles(table, {
10120    width: (width > 0) ? width : "100%",
10121    height: (height > 0) ? height : "100%"
10122   });
10123   var tbody = document.createElement("TBODY");
10124   table.appendChild(tbody);
10125   var tr = document.createElement("TR");
10126   tbody.appendChild(tr);
10127   var td = document.createElement("TD");
10128   tr.appendChild(td);
10129   td.align = "center";
10130   td.vAlign = "middle";
10131   element = this.CloneLoadingPanel(element, td);
10132   ASPx.SetElementDisplay(element, true, true);
10133   this.loadingPanelElement = element;
10134   return element;
10135  } else
10136   parentElement.innerHTML = "&nbsp;";
10137  return null;
10138 },
10139 CreateLoadingPanelWithAbsolutePosition: function(parentElement, offsetElement) {
10140  if(this.ShouldHideExistingLoadingElements())
10141   this.HideLoadingPanel();
10142  if(parentElement == null)
10143   return null;
10144  if(!this.IsLoadingContainerVisible()) {
10145   this.hasPhantomLoadingElements = true;
10146   return null;
10147  }
10148  if(!offsetElement)
10149   offsetElement = parentElement;
10150  var element = this.GetLoadingPanelElement();
10151  if(element != null) {
10152   element = this.CloneLoadingPanel(element, parentElement);
10153   ASPx.SetStyles(element, {
10154    position: "absolute"
10155   });
10156   ASPx.SetElementDisplay(element, true, true);
10157   ASPx.Evt.AttachEventToElement(element, ASPx.Evt.GetMouseWheelEventName(), ASPx.Evt.PreventEvent);
10158   this.SetLoadingPanelLocation(offsetElement, element);
10159   this.loadingPanelElement = element;
10160   return element;
10161  }
10162  return null;
10163 },
10164 CreateLoadingPanelInline: function(parentElement, centerInParent){
10165  if(this.ShouldHideExistingLoadingElements())
10166   this.HideLoadingPanel();
10167  if(parentElement == null)
10168   return null;
10169  if(!this.IsLoadingContainerVisible()) {
10170   this.hasPhantomLoadingElements = true;
10171   return null;
10172  }
10173  var element = this.GetLoadingPanelElement();
10174  if(element != null) {
10175   element = this.CloneLoadingPanel(element, parentElement);
10176   if(centerInParent){
10177    ASPx.SetElementDisplay(element, true, true, true);
10178    parentElement.style.textAlign = "center";
10179   }
10180   else
10181    ASPx.SetElementDisplay(element, true);
10182   this.loadingPanelElement = element;
10183   return element;
10184  }
10185  return null;
10186 },
10187 ShowLoadingPanel: function() {
10188 },
10189 ShowLoadingElements: function() {
10190  if(this.InCallback() || this.lpTimer > -1) return;
10191  this.ShowLoadingDiv();
10192  if(this.IsCallbackAnimationEnabled())
10193   this.StartBeginCallbackAnimation();
10194  else
10195   this.ShowLoadingElementsInternal();
10196 },
10197 ShowLoadingElementsInternal: function() {
10198  if(this.lpDelay > 0 && !this.IsCallbackAnimationEnabled()) 
10199   this.lpTimer = window.setTimeout(function() { 
10200    this.ShowLoadingPanelOnTimer(); 
10201   }.aspxBind(this), this.lpDelay);
10202  else {
10203   this.RestoreLoadingDivOpacity();
10204   this.ShowLoadingPanel();
10205  }
10206 },
10207 GetLoadingPanelOffsetElement: function (baseElement) {
10208  if(this.IsCallbackAnimationEnabled()) {
10209   var element = this.GetLoadingPanelCallbackAnimationOffsetElement();
10210   if(element) {
10211    var container = typeof(ASPx.AnimationHelper) != "undefined" ? ASPx.AnimationHelper.findSlideAnimationContainer(element) : null;
10212    if(container)
10213     return container.parentNode.parentNode;
10214    else
10215     return element;
10216   }
10217  }
10218  return baseElement;
10219 },
10220 GetLoadingPanelCallbackAnimationOffsetElement: function () {
10221  return this.GetCallbackAnimationElement();
10222 },
10223 IsCallbackAnimationEnabled: function () {
10224  return (this.enableCallbackAnimation || this.isSlideCallbackAnimationEnabled()) && !this.isCallbackAnimationPrevented;
10225 },
10226 GetDefaultanimationEngineType: function() {
10227  return ASPx.AnimationEngineType.DEFAULT;
10228 },
10229 StartBeginCallbackAnimation: function () {
10230  this.beginCallbackAnimationProcessing = true;
10231  this.isCallbackFinished = false;
10232  var element = this.GetCallbackAnimationElement();
10233  if(element && this.isSlideCallbackAnimationEnabled() && this.slideAnimationDirection) 
10234   ASPx.AnimationHelper.slideOut(element, this.slideAnimationDirection, this.FinishBeginCallbackAnimation.aspxBind(this), this.GetDefaultanimationEngineType());
10235  else if(element && this.enableCallbackAnimation) 
10236   ASPx.AnimationHelper.fadeOut(element, this.FinishBeginCallbackAnimation.aspxBind(this));
10237  else
10238   this.FinishBeginCallbackAnimation();
10239 },
10240 CancelBeginCallbackAnimation: function() {
10241  if(this.beginCallbackAnimationProcessing) {
10242   this.beginCallbackAnimationProcessing = false;
10243   var element = this.GetCallbackAnimationElement();
10244   ASPx.AnimationHelper.cancelAnimation(element);
10245  }
10246 },
10247 FinishBeginCallbackAnimation: function () {
10248  this.beginCallbackAnimationProcessing = false;
10249  if(!this.isCallbackFinished)
10250   this.ShowLoadingElementsInternal();
10251  else {
10252   this.DoCallback(this.savedCallbackResult);
10253   this.savedCallbackResult = null;
10254  }
10255 },
10256 CheckBeginCallbackAnimationInProgress: function(callbackResult) {
10257  if(this.beginCallbackAnimationProcessing) {
10258   this.savedCallbackResult = callbackResult;
10259   this.isCallbackFinished = true;
10260   return true;
10261  }
10262  return false;
10263 },
10264 StartEndCallbackAnimation: function () {
10265  this.HideLoadingPanel();
10266  this.SetInitialLoadingDivOpacity();
10267  this.RaiseEndCallbackAnimationStart();
10268  this.endCallbackAnimationProcessing = true;
10269  var element = this.GetCallbackAnimationElement();
10270  if(element && this.isSlideCallbackAnimationEnabled() && this.slideAnimationDirection) 
10271   ASPx.AnimationHelper.slideIn(element, this.slideAnimationDirection, this.FinishEndCallbackAnimation.aspxBind(this), this.GetDefaultanimationEngineType());
10272  else if(element && this.enableCallbackAnimation) 
10273   ASPx.AnimationHelper.fadeIn(element, this.FinishEndCallbackAnimation.aspxBind(this));
10274  else
10275   this.FinishEndCallbackAnimation();
10276  this.slideAnimationDirection = null;
10277 },
10278 FinishEndCallbackAnimation: function () {
10279  this.DoEndCallback();
10280  this.endCallbackAnimationProcessing = false;
10281  this.CheckRepeatGesture();
10282 },
10283 CheckEndCallbackAnimationNeeded: function() {
10284  if(!this.endCallbackAnimationProcessing && this.requestCount == 1) {
10285   this.StartEndCallbackAnimation();
10286   return true;
10287  }
10288  return false;
10289 },
10290 PreventCallbackAnimation: function() {
10291  this.isCallbackAnimationPrevented = true;
10292 },
10293 GetCallbackAnimationElement: function() {
10294  return null;
10295 },
10296 AssignSlideAnimationDirectionByPagerArgument: function(arg, currentPageIndex) {
10297  this.slideAnimationDirection = null;
10298  if(this.isSlideCallbackAnimationEnabled() && typeof(ASPx.AnimationHelper) != "undefined") {
10299   if(arg == PagerCommands.Next || arg == PagerCommands.Last)
10300    this.slideAnimationDirection = ASPx.AnimationHelper.SLIDE_LEFT_DIRECTION;
10301   else if(arg == PagerCommands.First || arg == PagerCommands.Prev)
10302    this.slideAnimationDirection = ASPx.AnimationHelper.SLIDE_RIGHT_DIRECTION;
10303   else if(!isNaN(currentPageIndex) && arg.indexOf(PagerCommands.PageNumber) == 0) {
10304    var newPageIndex = parseInt(arg.substring(2));
10305    if(!isNaN(newPageIndex))
10306     this.slideAnimationDirection = newPageIndex < currentPageIndex ? ASPx.AnimationHelper.SLIDE_RIGHT_DIRECTION : ASPx.AnimationHelper.SLIDE_LEFT_DIRECTION;
10307   }
10308  }
10309 },
10310 TryShowPhantomLoadingElements: function () {
10311  if(this.hasPhantomLoadingElements && this.InCallback()) {
10312   this.hasPhantomLoadingElements = false;
10313   this.ShowLoadingDivAndPanel();
10314  }
10315 },
10316 ShowLoadingDivAndPanel: function () {
10317  this.ShowLoadingDiv();
10318  this.RestoreLoadingDivOpacity();
10319  this.ShowLoadingPanel();
10320 },
10321 HideLoadingElements: function() {
10322  this.CancelBeginCallbackAnimation();
10323  this.HideLoadingPanel();
10324  this.HideLoadingDiv();
10325 },
10326 ShowLoadingPanelOnTimer: function() {
10327  this.ClearLoadingPanelTimer();
10328  if(!this.IsDOMDisposed()) {
10329   this.RestoreLoadingDivOpacity();
10330   this.ShowLoadingPanel();
10331  }
10332 },
10333 ClearLoadingPanelTimer: function() {
10334  this.lpTimer = ASPx.Timer.ClearTimer(this.lpTimer);  
10335 },
10336 HideLoadingPanel: function() {
10337  this.ClearLoadingPanelTimer();
10338  this.hasPhantomLoadingElements = false;
10339  if(ASPx.IsExistsElement(this.loadingPanelElement)) {
10340   ASPx.RemoveElement(this.loadingPanelElement);
10341   this.loadingPanelElement = null;
10342  }
10343 },
10344 SetLoadingPanelLocation: function(offsetElement, loadingPanel, x, y, offsetX, offsetY) {
10345  if(!ASPx.IsExists(x) || !ASPx.IsExists(y)){
10346   var x1 = ASPx.GetAbsoluteX(offsetElement);
10347   var y1 = ASPx.GetAbsoluteY(offsetElement);
10348   var x2 = x1;
10349   var y2 = y1;
10350   if(offsetElement == document.body){
10351    x2 += ASPx.GetDocumentMaxClientWidth();
10352    y2 += ASPx.GetDocumentMaxClientHeight();
10353   }
10354   else{
10355    x2 += offsetElement.offsetWidth;
10356    y2 += offsetElement.offsetHeight;
10357   }
10358   if(x1 < ASPx.GetDocumentScrollLeft())
10359    x1 = ASPx.GetDocumentScrollLeft();
10360   if(y1 < ASPx.GetDocumentScrollTop())
10361    y1 = ASPx.GetDocumentScrollTop();
10362   if(x2 > ASPx.GetDocumentScrollLeft() + ASPx.GetDocumentClientWidth())
10363    x2 = ASPx.GetDocumentScrollLeft() + ASPx.GetDocumentClientWidth();
10364   if(y2 > ASPx.GetDocumentScrollTop() + ASPx.GetDocumentClientHeight())
10365    y2 = ASPx.GetDocumentScrollTop() + ASPx.GetDocumentClientHeight();
10366   x = x1 + ((x2 - x1 - loadingPanel.offsetWidth) / 2);
10367   y = y1 + ((y2 - y1 - loadingPanel.offsetHeight) / 2);
10368  }
10369  if(ASPx.IsExists(offsetX) && ASPx.IsExists(offsetY)){
10370   x += offsetX;
10371   y += offsetY;
10372  }
10373  x = ASPx.PrepareClientPosForElement(x, loadingPanel, true);
10374  y = ASPx.PrepareClientPosForElement(y, loadingPanel, false);
10375  if(ASPx.Browser.IE && ASPx.Browser.Version > 8 && (y - Math.floor(y) === 0.5))
10376   y = Math.ceil(y);
10377  ASPx.SetStyles(loadingPanel, { left: x, top: y });
10378 },
10379 GetLoadingDiv: function(){
10380  return ASPx.GetElementById(this.name + "_LD");
10381 },
10382 CreateLoadingDiv: function(parentElement, offsetElement){
10383  if(this.ShouldHideExistingLoadingElements())
10384   this.HideLoadingDiv();
10385  if(parentElement == null) 
10386   return null;
10387  if(!this.IsLoadingContainerVisible()) {
10388   this.hasPhantomLoadingElements = true;
10389   return null;
10390  }
10391  if(!offsetElement)
10392   offsetElement = parentElement;
10393  var div = this.GetLoadingDiv();
10394  if(div != null){
10395   div = div.cloneNode(true);
10396   parentElement.appendChild(div);
10397   ASPx.SetElementDisplay(div, true, true);
10398   ASPx.Evt.AttachEventToElement(div, ASPx.TouchUIHelper.touchMouseDownEventName, ASPx.Evt.PreventEvent);
10399   ASPx.Evt.AttachEventToElement(div, ASPx.TouchUIHelper.touchMouseMoveEventName, ASPx.Evt.PreventEvent);
10400   ASPx.Evt.AttachEventToElement(div, ASPx.TouchUIHelper.touchMouseUpEventName, ASPx.Evt.PreventEvent);
10401   ASPx.Evt.AttachEventToElement(div, ASPx.Evt.GetMouseWheelEventName(), ASPx.Evt.PreventEvent);
10402   this.SetLoadingDivBounds(offsetElement, div);
10403   this.loadingDivElement = div;
10404   this.SetInitialLoadingDivOpacity();
10405   return div;
10406  }
10407  return null;
10408 },
10409 SetInitialLoadingDivOpacity: function() {
10410  if(!this.loadingDivElement) return;
10411  ASPx.Attr.SaveStyleAttribute(this.loadingDivElement, "opacity");
10412  ASPx.Attr.SaveStyleAttribute(this.loadingDivElement, "filter");
10413  ASPx.SetElementOpacity(this.loadingDivElement, 0.01);
10414 },
10415 RestoreLoadingDivOpacity: function() {
10416  if(!this.loadingDivElement) return;
10417  ASPx.Attr.RestoreStyleAttribute(this.loadingDivElement, "opacity");
10418  ASPx.Attr.RestoreStyleAttribute(this.loadingDivElement, "filter");
10419 },
10420 SetLoadingDivBounds: function(offsetElement, loadingDiv) {
10421  var absX = (offsetElement == document.body) ? 0 : ASPx.GetAbsoluteX(offsetElement);
10422  var absY = (offsetElement == document.body) ? 0 : ASPx.GetAbsoluteY(offsetElement);
10423  ASPx.SetStyles(loadingDiv, {
10424   left: ASPx.PrepareClientPosForElement(absX, loadingDiv, true),
10425   top: ASPx.PrepareClientPosForElement(absY, loadingDiv, false)
10426  });
10427  var width = (offsetElement == document.body) ? ASPx.GetDocumentWidth() : offsetElement.offsetWidth;
10428  var height = (offsetElement == document.body) ? ASPx.GetDocumentHeight() : offsetElement.offsetHeight;
10429  if(height < 0) 
10430   height = 0;
10431  ASPx.SetStyles(loadingDiv, { width: width, height: height });
10432  var correctedWidth = 2 * width - loadingDiv.offsetWidth;
10433  if(correctedWidth <= 0) correctedWidth = width;
10434  var correctedHeight = 2 * height - loadingDiv.offsetHeight;
10435  if(correctedHeight <= 0) correctedHeight = height;
10436  ASPx.SetStyles(loadingDiv, { width: correctedWidth, height: correctedHeight });
10437 },
10438 ShowLoadingDiv: function() {
10439 },
10440 HideLoadingDiv: function() {
10441  this.hasPhantomLoadingElements = false;
10442  if(ASPx.IsExistsElement(this.loadingDivElement)){
10443   ASPx.RemoveElement(this.loadingDivElement);
10444   this.loadingDivElement = null;
10445  }
10446 },
10447 CanHandleGesture: function(evt) {
10448  return false;
10449 },
10450 CanHandleGestureCore: function(evt) {
10451  var source = ASPx.Evt.GetEventSource(evt);
10452  if(ASPx.GetIsParent(this.loadingPanelElement, source) || ASPx.GetIsParent(this.loadingDivElement, source))
10453   return true; 
10454  var callbackAnimationElement = this.GetCallbackAnimationElement();
10455  if(!callbackAnimationElement)
10456   return false;
10457  var animationContainer = ASPx.AnimationHelper.getSlideAnimationContainer(callbackAnimationElement, false, false);
10458  if(animationContainer && ASPx.GetIsParent(animationContainer, source) && !ASPx.GetIsParent(animationContainer.childNodes[0], source))
10459   return true; 
10460  return this.CanHandleGesture(evt); 
10461 },
10462 AllowStartGesture: function() {
10463  return !this.beginCallbackAnimationProcessing && !this.endCallbackAnimationProcessing;
10464 },
10465 StartGesture: function() {
10466 },
10467 AllowExecuteGesture: function(value) {
10468  return false;
10469 },
10470 ExecuteGesture: function(value) {
10471 },
10472 CancelGesture: function(value) {
10473  if(this.repeatedGestureCount === 0) {
10474   this.repeatedGestureValue = value;
10475   this.repeatedGestureCount = 1;
10476  }
10477  else {
10478   if(this.repeatedGestureValue * value > 0)
10479    this.repeatedGestureCount++;
10480   else
10481    this.repeatedGestureCount--;
10482   if(this.repeatedGestureCount === 0)
10483    this.repeatedGestureCount = 0;
10484  }
10485 },
10486 CheckRepeatGesture: function() {
10487  if(this.repeatedGestureCount !== 0) {
10488   if(this.AllowExecuteGesture(this.repeatedGestureValue))
10489    this.ExecuteGesture(this.repeatedGestureValue, this.repeatedGestureCount);
10490   this.repeatedGestureValue = 0;
10491   this.repeatedGestureCount = 0;
10492  }
10493 },
10494 AllowExecutePagerGesture: function (pageIndex, pageCount, value) {
10495  if(pageIndex < 0) return false;
10496  if(pageCount <= 1) return false;
10497  if(value > 0 && pageIndex === 0) return false;
10498  if(value < 0 && pageIndex === pageCount - 1) return false;
10499  return true;
10500 },
10501 ExecutePagerGesture: function(pageIndex, pageCount, value, count, method) {
10502  if(!count) count = 1;
10503  var pageIndex = pageIndex + (value < 0 ? count : -count);
10504  if(pageIndex < 0) pageIndex = 0;
10505  if(pageIndex > pageCount - 1) pageIndex = pageCount - 1;
10506  method(PagerCommands.PageNumber + pageIndex);
10507 },
10508 RaiseInit: function(){
10509  if(!this.Init.IsEmpty()){
10510   var args = new ASPxClientEventArgs();
10511   this.Init.FireEvent(this, args);
10512  }
10513 },
10514 RaiseBeginCallbackInternal: function(command){
10515  if(!this.BeginCallback.IsEmpty()){
10516   var args = new ASPxClientBeginCallbackEventArgs(command);
10517   this.BeginCallback.FireEvent(this, args);
10518  }
10519 },
10520 RaiseEndCallbackInternal: function() {
10521  if(!this.EndCallback.IsEmpty()){
10522   var args = new ASPxClientEndCallbackEventArgs();
10523   this.EndCallback.FireEvent(this, args);
10524  }
10525 },
10526 RaiseCallbackErrorInternal: function(message, callbackId) {
10527  if(!this.CallbackError.IsEmpty()) {
10528   var args = new ASPxClientCallbackErrorEventArgs(message, callbackId);
10529   this.CallbackError.FireEvent(this, args);
10530   if(args.handled)
10531    return { isHandled: true, errorMessage: args.message };
10532  }
10533 },
10534 RaiseBeginCallback: function(command){
10535  this.RaiseBeginCallbackInternal(command);    
10536  aspxGetControlCollection().RaiseBeginCallback(this, command);
10537 },
10538 RaiseEndCallback: function(){
10539  this.RaiseEndCallbackInternal();
10540  aspxGetControlCollection().RaiseEndCallback(this);
10541 },
10542 RaiseCallbackError: function (message, callbackId) {
10543  var result = this.RaiseCallbackErrorInternal(message, callbackId);
10544  if(!result) 
10545   result = aspxGetControlCollection().RaiseCallbackError(this, message, callbackId);
10546  return result;
10547 },
10548 RaiseEndCallbackAnimationStart: function(){
10549  if(!this.EndCallbackAnimationStart.IsEmpty()){
10550   var args = new ASPxClientEventArgs();
10551   this.EndCallbackAnimationStart.FireEvent(this, args);
10552  }
10553 },
10554 RaiseBeforePronounce: function(message) {
10555  var args = new ASPxClientControlBeforePronounceEventArgs(message, this);
10556  if(!this.BeforePronounce.IsEmpty())
10557   this.BeforePronounce.FireEvent(this, args);
10558  return args;
10559 },
10560 SendMessageToAssistiveTechnology: function(message) {
10561  if(!this.accessibilityCompliant)
10562   return;
10563  this.PronounceMessageInternal(message, ASPx.AccessibilityPronouncerType.live);
10564 },
10565 PronounceMessageInternal: function(messageArg, type) {
10566  var message = messageArg;
10567  if(!ASPx.Ident.IsArray(messageArg))
10568   message = [messageArg];
10569  var args = this.RaiseBeforePronounce(message);
10570  ASPx.AccessibilityPronouncer.Pronounce(args, type);
10571 },
10572 IsVisible: function() {
10573  var element = this.GetMainElement();
10574  return ASPx.IsElementVisible(element);
10575 },
10576 IsDisplayedElement: function(element) {
10577  while(element && element.tagName != "BODY") {
10578   if(!ASPx.GetElementDisplay(element)) 
10579    return false;
10580   element = element.parentNode;
10581  }
10582  return true;
10583 },
10584 IsDisplayed: function() {
10585  return this.IsDisplayedElement(this.GetMainElement());
10586 },
10587 IsHiddenElement: function(element) {
10588  return element && element.offsetWidth == 0 && element.offsetHeight == 0;
10589 },
10590 IsHidden: function() {
10591  return this.IsHiddenElement(this.GetMainElement());
10592 },
10593 Focus: function() {
10594 },
10595 GetClientVisible: function(){
10596  return this.GetVisible();
10597 },
10598 SetClientVisible: function(visible){
10599  this.SetVisible(visible);
10600 },
10601 GetVisible: function(){
10602  return this.clientVisible;
10603 },
10604 SetVisible: function(visible){
10605  if(this.clientVisible != visible){
10606   this.clientVisible = visible;
10607   ASPx.SetElementDisplay(this.GetMainElement(), visible);
10608   if(visible) {
10609    this.AdjustControl();
10610    var mainElement = this.GetMainElement();
10611    if(mainElement)
10612     aspxGetControlCollection().AdjustControls(mainElement);
10613   }
10614  }
10615 },
10616 GetEnabled: function() {
10617  return this.clientEnabled;
10618 },
10619 SetEnabled: function(enabled) {
10620  this.clientEnabled = enabled;
10621  if(ASPxClientControl.setEnabledLocked)
10622   return;
10623  else
10624   ASPxClientControl.setEnabledLocked = true;
10625  this.savedClientEnabled = enabled;
10626  aspxGetControlCollection().ProcessControlsInContainer(this.GetMainElement(), function(control) {
10627   if(ASPx.IsFunction(control.SetEnabled))
10628    control.SetEnabled(enabled && control.savedClientEnabled);
10629  });
10630  delete ASPxClientControl.setEnabledLocked;
10631 },
10632 InCallback: function() {
10633  return this.requestCount > 0;
10634 },
10635 DoBeginCallback: function(command) {
10636  this.RaiseBeginCallback(command || "");
10637  aspxGetControlCollection().Before_WebForm_InitCallback(this.name);
10638  if(typeof(WebForm_InitCallback) != "undefined" && WebForm_InitCallback) {
10639   __theFormPostData = "";
10640   __theFormPostCollection = [ ];
10641   this.ClearPostBackEventInput("__EVENTTARGET");
10642   this.ClearPostBackEventInput("__EVENTARGUMENT");
10643   WebForm_InitCallback();
10644   this.savedFormPostData = __theFormPostData;   
10645   this.savedFormPostCollection = __theFormPostCollection;
10646  }
10647 },
10648 ClearPostBackEventInput: function(id){
10649  var element = ASPx.GetElementById(id);
10650  if(element != null) element.value = "";
10651 },
10652 PerformDataCallback: function(arg, handler) {
10653  this.CreateCustomDataCallback(arg, "", handler);
10654 },
10655 sendCallbackViaQueue: function (prefix, arg, showLoadingPanel, context, handler) {
10656  if (!this.useCallbackQueue())
10657   return false;
10658  var context = context || this;
10659  var token = this.callbackQueueHelper.sendCallback(ASPx.FormatCallbackArg(prefix, arg), context, handler || context.OnCallback, prefix);
10660  if (showLoadingPanel)
10661   this.callbackQueueHelper.showLoadingElements();
10662  return token;
10663 },
10664 CreateCallback: function (arg, command, handler) {
10665  var callbackInfo = this.CreateCallbackInfo(ASPx.CallbackType.Common, handler || null);
10666  var callbackID = this.CreateCallbackByInfo(arg, command, callbackInfo);
10667  return callbackID;
10668 },
10669 CreateCustomDataCallback: function(arg, command, handler) {
10670  var callbackInfo = this.CreateCallbackInfo(ASPx.CallbackType.Data, handler);
10671  this.CreateCallbackByInfo(arg, command, callbackInfo);
10672 },
10673 CreateCallbackByInfo: function(arg, command, callbackInfo) {
10674  if(!this.CanCreateCallback()) return;
10675  var callbackID;
10676  if(typeof(WebForm_DoCallback) != "undefined" && WebForm_DoCallback && ASPx.documentLoaded)
10677   callbackID = this.CreateCallbackInternal(arg, command, true, callbackInfo);
10678  else {
10679   if(!this.savedCallbacks)
10680    this.savedCallbacks = [];
10681   var callbackInfo = { arg: arg, command: command, callbackInfo: callbackInfo };
10682   if(this.allowMultipleCallbacks)
10683    this.savedCallbacks.push(callbackInfo);
10684   else
10685    this.savedCallbacks[0] = callbackInfo;
10686  }
10687  return callbackID;
10688 },
10689 CreateCallbackInternal: function(arg, command, viaTimer, callbackInfo) {
10690  var watcher = ASPx.ControlUpdateWatcher.getInstance();
10691  if(watcher && !watcher.CanSendCallback(this, arg)) {
10692   this.CancelCallbackInternal();
10693   return;
10694  }
10695  this.requestCount++;
10696  this.DoBeginCallback(command);
10697  if(typeof(arg) == "undefined")
10698   arg = "";
10699  if(typeof(command) == "undefined")
10700   command = "";
10701  var callbackID = this.SaveCallbackInfo(callbackInfo);
10702  if(viaTimer)
10703   window.setTimeout(function() { this.CreateCallbackCore(arg, command, callbackID); }.aspxBind(this), 0);
10704  else
10705   this.CreateCallbackCore(arg, command, callbackID);
10706  return callbackID;
10707 },
10708 CancelCallbackInternal: function() {
10709  this.CancelCallbackCore();
10710  this.HideLoadingElements();
10711 },
10712 CancelCallbackCore: function() {
10713 },
10714 CreateCallbackCore: function(arg, command, callbackID) {
10715  var callBackMethod = this.GetCallbackMethod(command);
10716  __theFormPostData = this.savedFormPostData;
10717  __theFormPostCollection = this.savedFormPostCollection;
10718  callBackMethod.call(this, this.GetSerializedCallbackInfoByID(callbackID) + arg);
10719 },
10720 GetCallbackMethod: function(command){
10721  return this.callBack;
10722 },
10723 CanCreateCallback: function() {
10724  return !this.InCallback() || (this.allowMultipleCallbacks && !this.beginCallbackA
10724nimationProcessing && !this.endCallbackAnimationProcessing);
10725 },
10726 DoLoadCallbackScripts: function() {
10727  ASPx.ProcessScriptsAndLinks(this.name, true);
10728 },
10729 DoEndCallback: function() {
10730  if(this.IsCallbackAnimationEnabled() && this.CheckEndCallbackAnimationNeeded()) 
10731   return;
10732  this.requestCount--;
10733  if (this.requestCount < 1) 
10734   this.callbackHandlersQueue.executeCallbacksHandlers();
10735  if(this.HideLoadingPanelOnCallback() && this.requestCount < 1) 
10736   this.HideLoadingElements();
10737  if(this.isSwipeGesturesEnabled() && this.supportGestures) {
10738   ASPx.GesturesHelper.UpdateSwipeAnimationContainer(this.name);
10739   if(this.touchUIMouseScroller)
10740    this.touchUIMouseScroller.update();
10741  }
10742  this.isCallbackAnimationPrevented = false;
10743  this.OnCallbackFinalized();
10744  this.AssignEllipsisTooltips();
10745  this.RaiseEndCallback();
10746 },
10747 DoFinalizeCallback: function() {
10748 },
10749 OnCallbackFinalized: function() {
10750 },
10751 AssignEllipsisTooltips: function() { },
10752 HideLoadingPanelOnCallback: function() {
10753  return true;
10754 },
10755 ShouldHideExistingLoadingElements: function() {
10756  return true;
10757 },
10758 EvalCallbackResult: function(resultString){
10759  return eval(resultString);
10760 },
10761 DoCallback: function(result) {
10762  if(this.IsCallbackAnimationEnabled() && this.CheckBeginCallbackA
10762nimationInProgress(result))
10763   return;
10764  result = ASPx.Str.Trim(result);
10765  if(result.indexOf(ASPx.CallbackResultPrefix) != 0) 
10766   this.ProcessCallbackGeneralError(result);
10767  else {
10768   var resultObj = null;
10769   try {
10770    resultObj = this.EvalCallbackResult(result);
10771   } 
10772   catch(e) {
10773   }
10774   if(resultObj) {
10775    ASPx.CacheHelper.DropCache(this);
10776    if(resultObj.redirect){
10777     if(!ASPx.Browser.IE)
10778      window.location.href = resultObj.redirect;
10779     else { 
10780      var fakeLink = document.createElement("a");
10781      fakeLink.href = resultObj.redirect;
10782      document.body.appendChild(fakeLink); 
10783      try { fakeLink.click(); } catch(e){ } 
10784     }
10785    }
10786    else if(ASPx.IsExists(resultObj.generalError)){
10787     this.ProcessCallbackGeneralError(resultObj.generalError);
10788    }
10789    else {
10790     var errorObj = resultObj.error;
10791     if(errorObj)
10792      this.ProcessCallbackError(errorObj,resultObj.id);
10793     else {
10794      if(resultObj.cp) {
10795       for(var name in resultObj.cp)
10796        this[name] = resultObj.cp[name];
10797      }
10798      var callbackInfo = this.DequeueCallbackInfo(resultObj.id);
10799      if(callbackInfo && callbackInfo.type == ASPx.CallbackType.Data)
10800       this.ProcessCustomDataCallback(resultObj.result, callbackInfo);
10801      else {
10802       if (this.useCallbackQueue() && this.callbackQueueHelper.getCallbackInfoById(resultObj.id))
10803        this.callbackQueueHelper.processCallback(resultObj.result, resultObj.id);
10804       else {
10805        this.ProcessCallback(resultObj.result, resultObj.id);
10806        if(callbackInfo && callbackInfo.handler) {
10807         var handlerInfo = { handler: callbackInfo.handler, result: resultObj.result.data };
10808         this.callbackHandlersQueue.addCallbackHandler(handlerInfo);
10809        }
10810       }
10811      }
10812     }
10813    }
10814   } 
10815  }
10816  this.DoLoadCallbackScripts();
10817 },
10818 DoCallbackError: function(result) {
10819  this.HideLoadingElements();
10820  this.ProcessCallbackGeneralError(result); 
10821 },
10822 DoControlClick: function(evt) {
10823  this.OnControlClick(ASPx.Evt.GetEventSource(evt), evt);
10824 },
10825 ProcessCallback: function (result, callbackId) {
10826  this.OnCallback(result, callbackId);
10827 },
10828 ProcessCustomDataCallback: function(result, callbackInfo) {
10829  if(callbackInfo.handler != null)
10830   callbackInfo.handler(this, result);
10831  this.RaiseCustomDataCallback(result);
10832 },
10833 RaiseCustomDataCallback: function(result) {
10834  if(!this.CustomDataCallback.IsEmpty()) {
10835   var arg = new ASPxClientCustomDataCallbackEventArgs(result);
10836   this.CustomDataCallback.FireEvent(this, arg);
10837  }
10838 },
10839 OnCallback: function(result) {
10840 },
10841 CreateCallbackInfo: function(type, handler) {
10842  return { type: type, handler: handler };
10843 },
10844 GetSerializedCallbackInfoByID: function(callbackID) {
10845  return this.GetCallbackInfoByID(callbackID).type + callbackID + ASPx.CallbackSeparator;
10846 },
10847 SaveCallbackInfo: function(callbackInfo) {
10848  var activeCallbacksInfo = this.GetActiveCallbacksInfo();
10849  for(var i = 0; i < activeCallbacksInfo.length; i++) {
10850   if(activeCallbacksInfo[i] == null) {
10851    activeCallbacksInfo[i] = callbackInfo;
10852    return i;
10853   }
10854  }
10855  activeCallbacksInfo.push(callbackInfo);
10856  return activeCallbacksInfo.length - 1;
10857 },
10858 GetActiveCallbacksInfo: function() {
10859  var persistentProperties = this.GetPersistentProperties();
10860  if(!persistentProperties.activeCallbacks)
10861   persistentProperties.activeCallbacks = [ ];
10862  return persistentProperties.activeCallbacks;
10863 },
10864 GetPersistentProperties: function() {
10865  var storage = _aspxGetPersistentControlPropertiesStorage();
10866  var persistentProperties = storage[this.name];
10867  if(!persistentProperties) {
10868   persistentProperties = { };
10869   storage[this.name] = persistentProperties;
10870  }
10871  return persistentProperties;
10872 },
10873 GetCallbackInfoByID: function(callbackID) {
10874  return this.GetActiveCallbacksInfo()[callbackID];
10875 },
10876 DequeueCallbackInfo: function(index) {
10877  var activeCallbacksInfo = this.GetActiveCallbacksInfo();
10878  if(index < 0 || index >= activeCallbacksInfo.length)
10879   return null;
10880  var result = activeCallbacksInfo[index];
10881  activeCallbacksInfo[index] = null;
10882  return result;
10883 },
10884 ProcessCallbackError: function (errorObj, callbackId) {
10885  var data = ASPx.IsExists(errorObj.data) ? errorObj.data : null;
10886  var result = this.RaiseCallbackError(errorObj.message, callbackId);
10887  if(result.isHandled)
10888   this.OnCallbackErrorAfterUserHandle(result.errorMessage, data); 
10889  else
10890   this.OnCallbackError(result.errorMessage, data); 
10891 },
10892 OnCallbackError: function(errorMessage, data) {
10893  if(errorMessage)
10894   ASPx.ShowErrorAlert(errorMessage);
10895 },
10896 OnCallbackErrorAfterUserHandle: function(errorMessage, data) {
10897 },
10898 ProcessCallbackGeneralError: function(errorMessage) {
10899  var result = this.RaiseCallbackError(errorMessage);
10900  if(!result.isHandled)
10901   this.OnCallbackGeneralError(result.errorMessage);
10902 },
10903 OnCallbackGeneralError: function(errorMessage) {
10904  this.OnCallbackError(errorMessage, null);
10905 },
10906 SendPostBack: function(params) {
10907  if(typeof(__doPostBack) != "undefined")
10908   __doPostBack(this.uniqueID, params);
10909  else{
10910   var form = this.GetParentForm();
10911   if(form) form.submit();
10912  }
10913 },
10914 IsValidInstance: function () {
10915  return aspxGetControlCollection().GetByName(this.name) === this;
10916 },
10917 OnDispose: function() { 
10918  var varName = this.globalName;
10919  if(varName && varName !== "" && window && window[varName] && window[varName] == this){
10920   try{
10921    delete window[varName];
10922   }
10923   catch(e){  }
10924  }
10925  if(this.callbackQueueHelper)
10926   this.callbackQueueHelper.detachEvents();
10927 },
10928 OnGlobalControlsInitialized: function(args) { 
10929 },
10930 OnGlobalBrowserWindowResized: function(args) { 
10931 },
10932 OnGlobalBeginCallback: function(args) { 
10933 },
10934 OnGlobalEndCallback: function(args) { 
10935 },
10936 OnGlobalCallbackError: function(args) { 
10937 },
10938 OnGlobalValidationCompleted: function(args) { 
10939 },
10940 DOMContentLoaded: function() { },
10941 IsStateControllerEnabled: function() { return false; },
10942 InitializeDOM: function() {
10943  var mainElement = this.GetMainElement();
10944  if(mainElement)
10945   mainElement["dxinit"] = true;
10946 },
10947 IsDOMInitialized: function() {
10948  var mainElement = this.GetMainElement();
10949  return mainElement && mainElement["dxinit"];
10950 },
10951 AdjustControl: function(nestedCall) { },
10952 OnBrowserWindowResizeInternal: function(e) { },
10953 RegisterInControlTree: function(tree) { }
10954});
10955ASPxClientControlBase.Cast = function(obj) {
10956 if(typeof obj == "string")
10957  return window[obj];
10958 return obj;
10959};
10960var persistentControlPropertiesStorage = null;
10961function _aspxGetPersistentControlPropertiesStorage() {
10962 if(persistentControlPropertiesStorage == null)
10963  persistentControlPropertiesStorage = { };
10964 return persistentControlPropertiesStorage;
10965}
10966var ELLIPSIS_MARKER_CLASS = "dx-ellipsis";
10967var ELLIPSIS_TOOLTIP_MARKER_ATTR = "dxEllipsisTitle";
10968var ASPxClientControl = ASPx.CreateClass(ASPxClientControlBase, {
10969 constructor: function(name){
10970  this.constructor.prototype.constructor.call(this, name);
10971  this.rtl = false;
10972  this.enableEllipsis = false;
10973  this.isNative = false;
10974  this.isControlCollapsed = false;
10975  this.isInsideHierarchyAdjustment = false;
10976  this.controlOwner = null;
10977  this.adjustedSizes = { };
10978  this.dialogContentHashTable = { };
10979  this.renderIFrameForPopupElements = false;
10980  this.widthValueSetInPercentage = false;
10981  this.heightValueSetInPercentage = false;
10982  this.verticalAlignedElements = { };
10983  this.wrappedTextContainers = { };
10984  this.scrollPositionState = { };
10985  this.sizingConfig = {
10986   allowSetWidth: true,
10987   allowSetHeight: true,
10988   correction : false,
10989   adjustControl : false,
10990   supportPercentHeight: false,
10991   supportAutoHeight: false
10992  };
10993  this.percentSizeConfig = {
10994   width: -1,
10995   height: -1,
10996   markerWidth: -1,
10997   markerHeight: -1
10998  };  
10999 },
11000 InlineInitialize: function() {
11001  this.InitializeDOM();
11002  ASPxClientControlBase.prototype.InlineInitialize.call(this);
11003 },
11004 AfterCreate: function() { 
11005  ASPxClientControlBase.prototype.AfterCreate.call(this);
11006  if(!this.CanInitializeAdjustmentOnDOMContentLoaded() || ASPx.IsStartupScriptsRunning())
11007   this.InitializeAdjustment();
11008 },
11009 DOMContentLoaded: function() {
11010  if(this.CanInitializeAdjustmentOnDOMContentLoaded()) 
11011   this.InitializeAdjustment();
11012 },
11013 CanInitializeAdjustmentOnDOMContentLoaded: function() {
11014  return !ASPx.Browser.IE || ASPx.Browser.Version >= 10; 
11015 },
11016 InitializeAdjustment: function() {
11017  this.UpdateAdjustmentFlags();
11018  this.AdjustControl();
11019 },
11020 AfterInitialize: function() {
11021  this.AdjustControl();
11022  ASPxClientControlBase.prototype.AfterInitialize.call(this);
11023 },
11024 IsStateControllerEnabled: function(){
11025  return typeof(ASPx.GetStateController) != "undefined" && ASPx.GetStateController();
11026 },
11027 GetWidth: function() {
11028  return this.GetMainElement().offsetWidth;
11029 },
11030 GetHeight: function() {
11031  return this.GetMainElement().offsetHeight;
11032 },
11033 SetWidth: function(width) {
11034  if(this.sizingConfig.allowSetWidth)
11035   this.SetSizeCore("width", width, "GetWidth", false);
11036 },
11037 SetHeight: function(height) {
11038  if(this.sizingConfig.allowSetHeight)
11039   this.SetSizeCore("height", height, "GetHeight", false);
11040 },
11041 SetSizeCore: function(sizePropertyName, size, getFunctionName, corrected) {
11042  if(size < 0)
11043   return;
11044  this.GetMainElement().style[sizePropertyName] = size + "px";
11045  this.UpdateAdjustmentFlags(sizePropertyName);
11046  if(this.sizingConfig.adjustControl)
11047   this.AdjustControl(true);
11048  if(this.sizingConfig.correction && !corrected) {
11049   var realSize = this[getFunctionName]();
11050   if(realSize != size) {
11051    var correctedSize = size - (realSize - size);
11052    this.SetSizeCore(sizePropertyName, correctedSize, getFunctionName, true);
11053   }
11054  }
11055 },
11056 AdjustControl: function(nestedCall) {
11057  if(this.IsAdjustmentRequired() && (!ASPxClientControl.adjustControl
11057Locked || nestedCall)) {
11058   ASPxClientControl.adjustControlLocked = true;
11059   try {
11060    if(!this.IsAdjustmentAllowed())
11061     return;
11062    this.AdjustControlCore();
11063    this.UpdateAdjustedSizes();
11064   } 
11065   finally {
11066    delete ASPxClientControl.adjustControlLocked;
11067   }
11068  }
11069  this.AssignEllipsisTooltips();
11070  this.TryShowPhantomLoadingElements();
11071 },
11072 ResetControlAdjustment: function () {
11073  this.adjustedSizes = { };
11074 },
11075 UpdateAdjustmentFlags: function(sizeProperty) {
11076  var mainElement = this.GetMainElement();
11077  if(mainElement) {
11078   var mainElementStyle = ASPx.GetCurrentStyle(mainElement);
11079   this.UpdatePercentSizeConfig([mainElementStyle.width, mainElement.style.width], [mainElementStyle.height, mainElement.style.height], sizeProperty);
11080  }
11081 },
11082 UpdatePercentSizeConfig: function(widths, heights, modifyStyleProperty) {
11083  switch(modifyStyleProperty) {
11084   case "width":
11085    this.UpdatePercentWidthConfig(widths);
11086    break;
11087   case "height":
11088    this.UpdatePercentHeightConfig(heights);
11089    break;
11090   default:
11091    this.UpdatePercentWidthConfig(widths);
11092    this.UpdatePercentHeightConfig(heights);
11093    break;
11094  }
11095  this.ResetControlPercentMarkerSize();
11096 },
11097 UpdatePercentWidthConfig: function(widths) {
11098  this.widthValueSetInPercentage = false;
11099  for(var i = 0; i < widths.length; i++) {
11100   if(this.IsPercentageWidth(widths[i])) {
11101    this.percentSizeConfig.width = widths[i];
11102    this.widthValueSetInPercentage = true;
11103    break;
11104   }
11105  }
11106 },
11107 IsPercentageWidth: function(width) { return ASPx.IsPercentageSize(width); },
11108 UpdatePercentHeightConfig: function(heights) {
11109  this.heightValueSetInPercentage = false;
11110    for(var i = 0; i < heights.length; i++) {
11111   if(ASPx.IsPercentageSize(heights[i])) {
11112    this.percentSizeConfig.height = heights[i];
11113    this.heightValueSetInPercentage = true;
11114    break;
11115   }
11116  }
11117 },
11118 GetAdjustedSizes: function() {
11119  var mainElement = this.GetMainElement();
11120  if(mainElement) 
11121   return { width: mainElement.offsetWidth, height: mainElement.offsetHeight };
11122  return { width: 0, height: 0 };
11123 },
11124 IsAdjusted: function() {
11125  return (this.adjustedSizes.width && this.adjustedSizes.width > 0) && (this.adjustedSizes.height && this.adjustedSizes.height > 0);
11126 },
11127 IsAdjustmentRequired: function() {
11128  if(!this.IsAdjusted())
11129   return true;
11130  if(this.widthValueSetInPercentage)
11131   return true;
11132  if(this.heightValueSetInPercentage)
11133   return true;
11134  var sizes = this.GetAdjustedSizes();
11135  for(var name in sizes){
11136   if(this.adjustedSizes[name] !== sizes[name])
11137    return true;
11138  }
11139  return false;
11140 },
11141 IsAdjustmentAllowed: function() {
11142  var mainElement = this.GetMainElement();
11143  return mainElement && this.IsDisplayed() && !this.IsHidden() && this.IsDOMInitialized();
11144 },
11145 UpdateAdjustedSizes: function() {
11146  var sizes = this.GetAdjustedSizes();
11147  for(var name in sizes)
11148   this.adjustedSizes[name] = sizes[name];
11149 },
11150 AdjustControlCore: function() {
11151 },
11152 AdjustAutoHeight: function() {
11153 },
11154 IsControlCollapsed: function() {
11155  return this.isControlCollapsed;
11156 },
11157 NeedCollapseControl: function() {
11158  return this.NeedCollapseControlCore() && this.IsAdjustmentRequired() && this.IsAdjustmentAllowed();
11159 },
11160 NeedCollapseControlCore: function() {
11161  return false;
11162 },
11163 CollapseEditor: function() {
11164 },
11165 CollapseControl: function() {
11166  this.SaveScrollPositions();
11167  var mainElement = this.GetMainElement(),
11168   marker = this.GetControlPercentSizeMarker();
11169  marker.style.height = this.heightValueSetInPercentage && this.sizingConfig.supportPercentHeight
11170   ? this.percentSizeConfig.height 
11171   : (mainElement.offsetHeight + "px");
11172  mainElement.style.display = "none";
11173  this.isControlCollapsed = true;
11174 },
11175 ExpandControl: function() {
11176  var mainElement = this.GetMainElement();
11177  mainElement.style.display = "";
11178  this.GetControlPercentSizeMarker().style.height = "0px";
11179  this.isControlCollapsed = false;
11180  this.RestoreScrollPositions();
11181 },
11182 CanCauseReadjustment: function() {
11183  return this.NeedCollapseControlCore();
11184 },
11185 IsExpandableByAdjustment: function() {
11186  return false;
11187 },
11188 HasFixedPosition: function() {
11189  return false;
11190 },
11191 SaveScrollPositions: function() {
11192  var mainElement = this.GetMainElement();
11193  this.scrollPositionState.outer = ASPx.GetOuterScrollPosition(mainElement.parentNode);
11194  this.scrollPositionState.inner = ASPx.GetInnerScrollPositions(mainElement);
11195 },
11196 RestoreScrollPositions: function() {
11197  ASPx.RestoreOuterScrollPosition(this.scrollPositionState.outer);
11198  ASPx.RestoreInnerScrollPositions(this.scrollPositionState.inner);
11199 },
11200 GetControlPercentSizeMarker: function() {
11201  if(this.percentSizeMarker === undefined) {
11202   this.percentSizeMarker = ASPx.CreateHtmlElementFromString("<div style='height:0px;font-size:0px;line-height:0;width:100%;'></div>");
11203   ASPx.InsertElementAfter(this.percentSizeMarker, this.GetMainElement());
11204  }
11205  return this.percentSizeMarker;
11206 },
11207 KeepControlPercentSizeMarker: function(needCollapse, needCalculateHeight) {
11208  var mainElement = this.GetMainElement(),
11209   marker = this.GetControlPercentSizeMarker(),
11210   markerHeight;
11211  if(needCollapse)
11212   this.CollapseControl();
11213  if(this.widthValueSetInPercentage && marker.style.width !== this.percentSizeConfig.width)
11214   marker.style.width = this.percentSizeConfig.width;
11215  if(needCalculateHeight) {
11216   if(this.IsControlCollapsed())
11217    markerHeight = marker.style.height;
11218   marker.style.height = this.percentSizeConfig.height;
11219  }
11220  this.percentSizeConfig.markerWidth = marker.offsetWidth;
11221  if(needCalculateHeight) {
11222   this.percentSizeConfig.markerHeight = marker.offsetHeight;
11223   if(this.IsControlCollapsed())
11224    marker.style.height = markerHeight;
11225   else
11226    marker.style.height = "0px";
11227  }
11228  if(needCollapse)
11229   this.ExpandControl();
11230 },
11231 ResetControlPercentMarkerSize: function() {
11232  this.percentSizeConfig.markerWidth = -1;
11233  this.percentSizeConfig.markerHeight = -1;
11234 },
11235 GetControlPercentMarkerSize: function(hideControl, force) {
11236  var needCalculateHeight = this.heightValueSetInPercentage && this.sizingConfig.supp
11236ortPercentHeight;
11237  if(force || this.percentSizeConfig.markerWidth < 1 || (needCalculateHeight && this.percentSizeConfig.markerHeight < 1))
11238   this.KeepControlPercentSizeMarker(hideControl && !this.IsControlCollapsed(), needCalculateHeight);
11239  return {
11240   width: this.percentSizeConfig.markerWidth,
11241   height: this.percentSizeConfig.markerHeight
11242  };
11243 },
11244 AssignEllipsisTooltips: function() {
11245  if(this.RequireAssignTooltips())
11246   this.AssignEllipsisTooltipsCore();
11247 },
11248 AssignEllipsisTooltipsCore: function(rootElement, reassingExistingTooltips) {
11249  var requirePaddingManipulation = ASPx.Browser.IE || ASPx.Browser.Edge || ASPx.Browser.Firefox;
11250  rootElement = rootElement || this.GetMainElement();
11251  var nodes = this.GetEllipsisNodes(rootElement);
11252  var nodeInfos = [];
11253  var nodesCount = nodes.length;
11254  for(var i = 0; i < nodesCount; i++) {
11255   var node = nodes[i];
11256   var info = { node: node };
11257   if(requirePaddingManipulation) {
11258    var style = ASPx.GetCurrentStyle(node);
11259    info.paddingLeft = node.style.paddingLeft;
11260    info.totalPadding = ASPx.GetLeftRightPaddings(node, style);
11261   }
11262   nodeInfos.push(info);
11263  }
11264  if(requirePaddingManipulation) {
11265   for(var i = 0; i < nodesCount; i++) {
11266    var info = nodeInfos[i];
11267    ASPx.SetStyles(info.node, { paddingLeft: info.totalPadding }, true);
11268   }
11269  }
11270  for(var i = 0; i < nodesCount; i++) {
11271   var info = nodeInfos[i];
11272   var node = info.node;
11273   info.isTextShortened = node.scrollWidth > node.clientWidth;
11274   info.hasTitle = !!node.title;
11275   if(!info.hasTitle || reassingExistingTooltips)
11276    info.title = this.GetEllipsisTooltipText(node);
11277  }
11278  for(var i = 0; i < nodesCount; i++) {
11279   var info = nodeInfos[i];
11280   var node = info.node;
11281   if(info.isTextShortened && info.title) {
11282    ASPx.Attr.SetAttribute(node, "title", info.title);
11283    ASPx.Attr.SetAttribute(node, ELLIPSIS_TOOLTIP_MARKER_ATTR, true);
11284   }
11285   if(!info.isTextShortened && info.hasTitle)
11286    ASPx.Attr.RemoveAttribute(node, "title");
11287  }
11288  if(requirePaddingManipulation) {
11289   for(var i = 0; i < nodesCount; i++) {
11290    var info = nodeInfos[i];
11291    var node = info.node;
11292    node.style.paddingLeft = info.paddingLeft;
11293   }
11294  }
11295 },
11296 GetEllipsisNodes: function(element) {
11297  var ellipsibleNodes = ASPx.Data.CollectionToArray(ASPx.GetNodesByClassName(element, ELLIPSIS_MARKER_CLASS));
11298  if(ASPx.ElementHasCssClass(element, ELLIPSIS_MARKER_CLASS))
11299   ellipsibleNodes.push(element);
11300  return ellipsibleNodes.filter(function(node) {
11301   return !ASPx.Attr.IsExistsAttribute(node, "title") || ASPx.Attr.IsExistsAttribute(node, ELLIPSIS_TOOLTIP_MARKER_ATTR);
11302  });
11303 },
11304 GetEllipsisTooltipText: function(element) {
11305  if(element && ASPx.IsExists(element.innerText))
11306   return element.innerText;
11307  return ASPx.GetInnerText(element);
11308 },
11309 RequireAssignTooltips: function() {
11310  return this.enableEllipsis && !ASPx.Browser.MobileUI;
11311 },
11312 OnBrowserWindowResize: function(e) {
11313 },
11314 OnBrowserWindowResizeInternal: function(e){
11315  if(this.BrowserWindowResizeSubscriber()) 
11316   this.OnBrowserWindowResize(e);
11317 },
11318 BrowserWindowResizeSubscriber: function() {
11319  return this.widthValueSetInPercentage || !this.IsAdjusted();
11320 },
11321 ShrinkWrappedText: function(getElements, key, reCorrect) {
11322  if(!ASPx.Browser.Safari) return;
11323  var elements = ASPx.CacheHelper.GetCachedElements(this, key, getElements, this.wrappedTextContainers);
11324  for(var i = 0; i < elements.length; i++)
11325   this.ShrinkWrappedTextInContainer(elements[i], reCorrect);
11326 },
11327 ShrinkWrappedTextInContainer: function(container, reCorrect) {
11328  if(!ASPx.Browser.Safari || !container || (container.dxWrappedTextShrinked && !reCorrect) || container.offsetWidth === 0) return;
11329  ASPx.ShrinkWrappedTextInContainer(container);
11330  container.dxWrappedTextShrinked = true;
11331 },
11332 CorrectWrappedText: function(getElements, key, reCorrect) {
11333  var elements = ASPx.CacheHelper.GetCachedElements(this, key, getElements, this.wrappedTextContainers);
11334  for(var i = 0; i < elements.length; i++)
11335   this.CorrectWrappedTextInContainer(elements[i], reCorrect);
11336 },
11337 CorrectWrappedTextInContainer: function(container, reCorrect) {
11338  if(!container || (container.dxWrappedTextCorrected && !reCorrect) || container.offsetWidth === 0) return;
11339  ASPx.AdjustWrappedTextInContainer(container);
11340  container.dxWrappedTextCorrected = true;
11341 },
11342 CorrectVerticalAlignment: function(alignMethod, getElements, key, reAlign) {
11343  var elements = ASPx.CacheHelper.GetCachedElements(this, key, getElements, this.verticalAlignedElements);
11344  for(var i = 0; i < elements.length; i++)
11345   this.CorrectElementVerticalAlignment(alignMethod, elements[i], reAlign);
11346 },
11347 CorrectElementVerticalAlignment: function(alignMethod, element, reAlign) {
11348  if(!element || (element.dxVerticalAligned && !reAlign) || element.offsetHeight === 0) return;
11349  alignMethod(element);
11350  element.dxVerticalAligned = true;
11351 },
11352 ClearVerticalAlignedElementsCache: function() {
11353  ASPx.CacheHelper.DropCache(this.verticalAlignedElements);
11354 },
11355 ClearWrappedTextContainersCache: function() {
11356  ASPx.CacheHelper.DropCache(this.wrappedTextContainers);
11357 },
11358 AdjustPagerControls: function() {
11359  if(typeof(ASPx.GetPagersCollection) != "undefined")
11360   ASPx.GetPagersCollection().AdjustControls(this.GetMainElement());
11361 },
11362 RegisterInControlTree: function(tree) {
11363  var mainElement = this.GetMainElement();
11364  if(mainElement && mainElement.id)
11365   tree.createNode(mainElement.id, this);
11366 },
11367 GetItemElementName: function(element) {
11368  var name = "";
11369  if(element.id)
11370   name = element.id.substring(this.name.length + 1);
11371  return name;
11372 },
11373 GetLinkElement: function(element) {
11374  if(element == null) return null;
11375  return (element.tagName == "A") ? element : ASPx.GetNodeByTagName(element, "A", 0);
11376 },
11377 GetInternalHyperlinkElement: function(parentElement, index) {
11378  var element = ASPx.GetNodeByTagName(parentElement, "A", index);
11379  if(element == null) 
11380   element = ASPx.GetNodeByTagName(parentElement, "SPAN", index);
11381  return element;
11382 },
11383 OnControlClick: function(clickedElement, htmlEvent) {
11384 }
11385});
11386ASPxClientControl.Cast = function(obj) {
11387 if(typeof obj == "string")
11388  return window[obj];
11389 return obj;
11390};
11391ASPxClientControl.AdjustControls = function(container, collapseControls){
11392 aspxGetControlCollection().AdjustControls(container, collapseControls);
11393};
11394ASPxClientControl.GetControlCollection = function(){
11395 return aspxGetControlCollection();
11396}
11397ASPxClientControl.LeadingAfterInitCallConsts = {
11398 None: 0,
11399 Direct: 1,
11400 Reverse: 2
11401};
11402var ASPxClientComponent = ASPx.CreateClass(ASPxClientControl, {
11403 constructor: function (name) {
11404  this.constructor.prototype.constructor.call(this, name);
11405 },
11406 IsDOMDisposed: function() { 
11407  return false;
11408 }
11409});
11410var ASPxClientControlCollection = ASPx.CreateClass(ASPx.CollectionBase, {
11411 constructor: function(){
11412  this.constructor.prototype.constructor.call(this);
11413  this.prevWndWidth = "";
11414  this.prevWndHeight = "";
11415  this.requestCountInternal = 0; 
11416  this.BeforeInitCallback = new ASPxClientEvent();
11417  this.ControlsInitialized = new ASPxClientEvent();
11418  this.BrowserWindowResized = new ASPxClientEvent();
11419  this.BeginCallback = new ASPxClientEvent();
11420  this.EndCallback = new ASPxClientEvent();
11421  this.CallbackError = new ASPxClientEvent();
11422  this.ValidationCompleted = new ASPxClientEvent();
11423  aspxGetControlCollectionCollection().Add(this);
11424 },
11425 Add: function(element) {
11426  var existsElement = this.Get(element.name);
11427  if(existsElement && existsElement !== element) 
11428   this.Remove(existsElement);
11429  ASPx.CollectionBase.prototype.Add.call(this, element.name, element);
11430 },
11431 Remove: function(element) {
11432  if(element && element instanceof ASPxClientControl)
11433   element.OnDispose();
11434  ASPx.CollectionBase.prototype.Remove.call(this, element.name);
11435 },
11436 GetGlobal: function(name) {
11437  var result = window[name];
11438  return result && Ident.IsASPxClientControl(result)
11439   ? result
11440   : null;
11441 },
11442 GetByName: function(name){
11443  return this.Get(name) || this.GetGlobal(name);
11444 },
11445 GetCollectionType: function(){
11446  return ASPxClientControlCollection.BaseCollectionType;
11447 },
11448 GetControlsByPredicate: function(predicate) {
11449  var result = [];
11450  this.ForEachControl(function(control) {
11451   if(!predicate || predicate(control))
11452    result.push(control);
11453  });
11454  return result;
11455 },
11456 GetControlsByType: function(type) {
11457  return this.GetControlsByPredicate(function(control) { 
11458   return type && (control instanceof type);
11459  });
11460 },
11461 ForEachControl: function(action, context) {
11462  context = context || this;
11463  this.elementsMap.forEachEntry(function(name, control) {
11464   if(Ident.IsASPxClientControl(control))
11465    return action.call(context, control);
11466  }, context);
11467 },
11468 forEachControlHierarchy: function(container, context, collapseControls, processFunc) {
11469  context = context || this;
11470  var controlTree = new ASPx.ControlTree(this, container);
11471  controlTree.forEachControl(collapseControls, function(control) {
11472   processFunc.call(context, control);
11473  });
11474 },
11475 AdjustControls: function(container, collapseControls) {
11476  container = container || null;
11477  window.setTimeout(function() {
11478   this.AdjustControlsCore(container, collapseControls);
11479  }.aspxBind(this), 0);
11480 },
11481 AdjustControlsCore: function(container, collapseControls) {
11482  this.forEachControlHierarchy(container, this, collapseControls, function(control) {
11483   control.AdjustControl();
11484  });
11485 },
11486 CollapseControls: function(container) {
11487  this.ProcessControlsInContainer(container, function(control) {
11488   if(control.isASPxClientEdit)
11489    control.CollapseEditor();
11490   else if(!!window.ASPxClientRibbon && control instanceof ASPxClientRibbon)
11491    control.CollapseControl();
11492  });
11493 },
11494 AtlasInitialize: function(isCallback) {
11495  if(ASPx.Browser.IE && ASPx.Browser.MajorVersion < 9) {
11496   var func = function() {
11497    if(_aspxIsLinksLoaded())
11498     ASPx.ProcessScriptsAndLinks("", isCallback); 
11499    else
11500     setTimeout(func, 100);
11501   }   
11502   func();
11503  }
11504  else
11505   ASPx.ProcessScriptsAndLinks("", isCallback);
11506 },
11507 DOMContentLoaded: function() {
11508  this.ForEachControl(function(control){
11509    control.DOMContentLoaded();
11510  });
11511 },
11512 Initialize: function() {
11513  ASPx.GetPostHandler().Post.AddHandler(
11514   function(s, e) { this.OnPost(e); }.aspxBind(this)
11515  );
11516  ASPx.GetPostHandler().PostFinalization.AddHandler(
11517   function(s, e) { this.OnPostFinalization(e); }.aspxBind(this)
11518  );
11519  this.InitializeElements(false );
11520  if(typeof(Sys) != "undefined" && typeof(Sys.Application) != "undefined") {
11521   var checkIsInitialized = function() {
11522    if(Sys.Application.get_isInitialized())
11523     Sys.Application.add_load(aspxCAInit);
11524    else
11525     setTimeout(checkIsInitialized, 0);
11526   }
11527   checkIsInitialized();
11528  }
11529  this.InitWindowSizeCache();
11530 },
11531 InitializeElements: function(isCallback) {
11532  this.ForEachControl(function(control){
11533   if(!control.isInitialized)
11534    control.Initialize();
11535  });
11536  this.AfterInitializeElementsLeadingCall();
11537  this.AfterInitializeElements();
11538  this.RaiseControlsInitialized(isCallback);
11539 },
11540 AfterInitializeElementsLeadingCall: function() {
11541  var controls = {};
11542  controls[ASPxClientControl.LeadingAfterInitCallConsts.Direct] = [];
11543  controls[ASPxClientControl.LeadingAfterInitCallConsts.Reverse] = [];
11544  this.ForEachControl(function(control) {
11545   if(control.leadingAfterInitCall != ASPxClientControl.LeadingAfterInitCallConsts.None && !control.isInitialized)
11546    controls[control.leadingAfterInitCall].push(control);
11547  });
11548  var directInitControls = controls[ASPxClientControl.LeadingAfterInitCallConsts.Direct],
11549   reverseInitControls = controls[ASPxClientControl.LeadingAfterInitCallConsts.Reverse];
11550  for(var i = 0, control; control = directInitControls[i]; i++)
11551   control.AfterInitialize();
11552  for(var i = reverseInitControls.length - 1, control; control = reverseInitControls[i]; i--)
11553   control.AfterInitialize();
11554 },
11555 AfterInitializeElements: function() {
11556  this.ForEachControl(function(control) {
11557   if(control.leadingAfterInitCall == ASPxClientControl.LeadingAfterInitCallConsts.None && !control.isInitialized)
11558    control.AfterInitialize();
11559  });
11560  ASPx.RippleHelper.Init();
11561 },
11562 DoFinalizeCallback: function() {
11563  this.ForEachControl(function(control){
11564   control.DoFinalizeCallback();
11565  });
11566 },
11567 ProcessControlsInContainer: function(container, processFunc) {
11568  this.ForEachControl(function(control){
11569   if(!container || this.IsControlInContainer(container, control))
11570    processFunc(control);
11571  });
11572 },
11573 IsControlInContainer: function(container, control) {
11574  if(control.GetMainElement) {
11575   var mainElement = control.GetMainElement();
11576   if(mainElement && (mainElement != container)) {
11577    if(ASPx.GetIsParent(container, mainElement))
11578     return true;
11579   }
11580  }
11581  return false;
11582 },
11583 RaiseControlsInitialized: function(isCallback) {
11584  if(typeof(isCallback) == "undefined")
11585   isCallback = true;
11586  var args = new ASPxClientControlsInitializedEventArgs(isCallback);
11587  if(!this.ControlsInitialized.IsEmpty())  
11588   this.ControlsInitialized.FireEvent(this, args);
11589  this.ForEachControl(function(control){
11590   control.OnGlobalControlsInitialized(args);
11591  });
11592 },
11593 RaiseBrowserWindowResized: function() {
11594  var args = new ASPxClientEventArgs();
11595  if(!this.BrowserWindowResized.IsEmpty())
11596   this.BrowserWindowResized.FireEvent(this, args);
11597  this.ForEachControl(function(control){
11598   control.OnGlobalBrowserWindowResized(args);
11599  });
11600 },
11601 RaiseBeginCallback: function (control, command) {
11602  var args = new ASPxClientGlobalBeginCallbackEventArgs(control, command);
11603  if(!this.BeginCallback.IsEmpty())
11604   this.BeginCallback.FireEvent(this, args);
11605  this.ForEachControl(function(control){
11606   control.OnGlobalBeginCallback(args);
11607  });
11608  this.IncrementRequestCount();
11609 },
11610 RaiseEndCallback: function (control) {
11611  var args = new ASPxClientGlobalEndCallbackEventArgs(control);
11612  if (!this.EndCallback.IsEmpty()) 
11613   this.EndCallback.FireEvent(this, args);
11614  this.ForEachControl(function(control){
11615   control.OnGlobalEndCallback(args);
11616  });
11617  this.DecrementRequestCount();
11618 },
11619 InCallback: function() {
11620  return this.requestCountInternal > 0;
11621 },
11622 RaiseCallbackError: function (control, message, callbackId) {
11623  var args = new ASPxClientGlobalCallbackErrorEventArgs(control, message, callbackId);
11624  if (!this.CallbackError.IsEmpty()) 
11625   this.CallbackError.FireEvent(this, args);
11626  this.ForEachControl(function(control){
11627   control.OnGlobalCallbackError(args);
11628  });
11629  if(args.handled)
11630   return { isHandled: true, errorMessage: args.message };  
11631  return { isHandled: false, errorMessage: message };
11632 },
11633 RaiseValidationCompleted: function (container, validationGroup, invisibleControlsValidated, isValid, firstInvalidControl, firstVisibleInvalidControl) {
11634  var args = new ASPxClientValidationCompletedEventArgs(container, validationGroup, invisibleControlsValidated, isValid, firstInvalidControl, firstVisibleInvalidControl);
11635  if (!this.ValidationCompleted.IsEmpty()) 
11636   this.ValidationCompleted.FireEvent(this, args);
11637  this.ForEachControl(function(control){
11638   control.OnGlobalValidationCompleted(args);
11639  });
11640 },
11641 Before_WebForm_InitCallback: function(callbackOwnerID){
11642  var args = new BeforeInitCallbackEventArgs(callbackOwnerID);
11643  this.BeforeInitCallback.FireEvent(this, args);
11644 },
11645 InitWindowSizeCache: function(){
11646  this.prevWndWidth = ASPx.GetDocumentClientWidth();
11647  this.prevWndHeight = ASPx.GetDocumentClientHeight();
11648 },
11649 OnBrowserWindowResize: function(evt){
11650  var shouldIgnoreNestedEvents = ASPx.Browser.IE && ASPx.Browser.MajorVersion == 8;
11651  if(shouldIgnoreNestedEvents) {
11652   if(this.prevWndWidth === "" || this.prevWndHeight === "" || this.browserWindowResizeLocked)
11653    return;
11654   this.browserWindowResizeLocked = true;
11655  }
11656  this.OnBrowserWindowResizeCore(evt);
11657  if(shouldIgnoreNestedEvents)
11658   this.browserWindowResizeLocked = false;
11659 },
11660 OnBrowserWindowResizeCore: function(htmlEvent){
11661  var args = this.CreateOnBrowserWindowResizeEventArgs(htmlEvent);
11662  if(this.CalculateIsBrowserWindowSizeChanged()) {
11663   this.forEachControlHierarchy(null, this, true, function(control) {
11664    if(control.IsDOMInitialized())
11665     control.OnBrowserWindowResizeInternal(args);
11666   });
11667   this.RaiseBrowserWindowResized();
11668  }
11669 },
11670 CreateOnBrowserWindowResizeEventArgs: function(htmlEvent){
11671  return {
11672   htmlEvent: htmlEvent,
11673   wndWidth: ASPx.GetDocumentClientWidth(),
11674   wndHeight: ASPx.GetDocumentClientHeight(),
11675   prevWndWidth: this.prevWndWidth,
11676   prevWndHeight: this.prevWndHeight
11677  }
11678 },
11679 CalculateIsBrowserWindowSizeChanged: function(){
11680  var wndWidth = ASPx.GetDocumentClientWidth();
11681  var wndHeight = ASPx.GetDocumentClientHeight();
11682  var isBrowserWindowSizeChanged = (this.prevWndWidth != wndWidth) || (this.prevWndHeight != wndHeight);
11683  if(isBrowserWindowSizeChanged){
11684   this.prevWndWidth = wndWidth;
11685   this.prevWndHeight = wndHeight;
11686   return true;
11687  }
11688  return false;
11689 },
11690 OnPost: function(args){
11691  this.ForEachControl(function(control) {
11692   control.OnPost(args);
11693  }, null);
11694 },
11695 OnPostFinalization: function(args){
11696  this.ForEachControl(function(control) {
11697   control.OnPostFinalization(args);
11698  }, null);
11699 },
11700 IncrementRequestCount: function() {
11701  this.requestCountInternal++;
11702 },
11703 DecrementRequestCount: function() {
11704  this.requestCountInternal--;
11705 },
11706 ResetRequestCount: function() {
11707  this.requestCountInternal = 0;
11708 }
11709});
11710ASPxClientControlCollection.BaseCollectionType = "Control";
11711var controlCollection = null;
11712function aspxGetControlCollection(){
11713 if(controlCollection == null) 
11714  controlCollection = new ASPxClientControlCollection();
11715 return controlCollection;
11716}
11717var ControlCollectionCollection = ASPx.CreateClass(ASPx.CollectionBase, {
11718 constructor: function(){
11719  this.constructor.prototype.constructor.call(this);
11720 },
11721 Add: function(element) {
11722  var key = element.GetCollectionType();
11723  if(!key) throw "The collection type isn't specified.";
11724  if(this.Get(key)) throw "The collection with type='" + key + "' already exists.";
11725  ASPx.CollectionBase.prototype.Add.call(this, key, element);
11726 },
11727 RemoveDisposedControls: function(){
11728  var baseCollection = this.Get(ASPxClientControlCollection.BaseCollectionType);
11729  var disposedControls = [];
11730  baseCollection.elementsMap.forEachEntry(function(name, control) {
11731   if(!ASPx.Ident.IsASPxClientControl(control)) return;
11732   if(control.IsDOMDisposed())
11733    disposedControls.push(control);
11734  });
11735  for(var i = 0; i < disposedControls.length; i++) {
11736   this.elementsMap.forEachEntry(function(key, collection) {
11737    if(ASPx.Ident.IsASPxClientCollection(collection))
11738     collection.Remove(disposedControls[i]);
11739   });
11740  }
11741 }
11742});
11743var controlCollectionCollection = null;
11744function aspxGetControlCollectionCollection(){
11745 if(controlCollectionCollection == null)
11746  controlCollectionCollection = new ControlCollectionCollection();
11747 return controlCollectionCollection;
11748}
11749var AriaDescriptionAttributes = {
11750 Role: "0",
11751 AriaLabel: "1",
11752 TabIndex: "2",
11753 AriaOwns: "3",
11754 AriaDescribedBy: "4",
11755 AriaDisabled: "5",
11756 AriaHasPopup: "6",
11757 AriaLevel: "7"
11758};
11759var AriaDescriptor = ASPx.CreateClass(null, {
11760 constructor: function(ownerControl, description) {
11761  this.ownerControl = ownerControl;
11762  this.rootElement = ownerControl.GetMainElement();
11763  this.description = description;
11764 },
11765 setDescription: function(name, argList) {
11766  var description = this.findChildDescription(name);
11767  if(description) {
11768   var elements = name ? this.rootElement.querySelectorAll(this.getDescriptionSelector(description)) : [this.rootElement];
11769   for(var i = 0; i < elements.length; i++)
11770    this.applyDescriptionToElement(elements[i], description, argList[i] || argList[0]);
11771  }
11772 },
11773 getDescriptionName: function(description) {
11774  return description.n;
11775 },
11776 getDescriptionSelector: function(description) {
11777  return description.s;
11778 },
11779 findChildDescription: function(name) {
11780  if(name === this.getDescriptionName(this.description))
11781   return this.description;
11782  var childCollection = this.description.c || [];
11783  for(var i = 0; i < childCollection.length; i++) {
11784   var childDescription = childCollection[i];
11785   if(this.getDescriptionName(childDescription) === name)
11786    return childDescription;
11787  }
11788  return null;
11789 },
11790 applyDescriptionToElement: function(element, description, args) {
11791  if(!description || !element)
11792   return;
11793  this.trySetAriaOwnsAttribute(element, description);
11794  this.trySetAriaDescribedByAttribute(element, description);
11795  this.trySetAttribute(element, description, AriaDescriptionAttributes.Role, "role");
11796  this.trySetAttribute(element, description, AriaDescriptionAttributes.TabIndex, "tabindex");
11797  this.trySetAttribute(element, description, AriaDescriptionAttributes.AriaLevel, "aria-level");
11798  this.executeOnDescription(description, AriaDescriptionAttributes.AriaLabel, function(value) {
11799   ASPx.Attr.SetAttribute(element, "aria-label", ASPx.Str.ApplyReplacement(value, args));
11800  });
11801  this.executeOnDescription(description, AriaDescriptionAttributes.AriaDisabled, function(value) {
11802   ASPx.Attr.SetAttribute(element, "aria-disabled", !!value); 
11803  });
11804  this.executeOnDescription(description, AriaDescriptionAttributes.AriaHasPopup, function(value) {
11805   ASPx.Attr.SetAttribute(element, "aria-haspopup", !!value);
11806  });
11807 },
11808 trySetAriaDescribedByAttribute: function(element, description) {
11809  this.executeOnDescription(description, AriaDescriptionAttributes.AriaDescribedBy, function(selectorInfo) {
11810   var descriptor = this.getNodesBySelector(element, selectorInfo.descriptorSelector)[0];
11811   var target = this.getNodesBySelector(element, selectorInfo.targetSelector)[0];
11812   if(!target || !descriptor)
11813    return;
11814   ASPx.Attr.SetAttribute(target, "aria-describedby", this.getNodeId(descriptor));
11815  });
11816 },
11817 trySetAriaOwnsAttribute: function(element, description) {
11818  this.executeOnDescription(description, AriaDescriptionAttributes.AriaOwns, function(selector) {
11819   var ownedNodes = this.getNodesBySelector(element, selector);
11820   var ariaOwnsAttributeValue = "";
11821   for(var i = 0; i < ownedNodes.length; i++)
11822    ariaOwnsAttributeValue += (this.getNodeId(ownedNodes[i]) + (i != ownedNodes.length - 1 ? " " : ""));
11823   ASPx.Attr.SetAttribute(element, "aria-owns", ariaOwnsAttributeValue);
11824  });
11825 },
11826 trySetAttribute: function(element, description, ariaAttribute, attributeName) {
11827  this.executeOnDescription(description, ariaAttribute, function(value) { 
11828   ASPx.Attr.SetAttribute(element, attributeName, description[ariaAttribute]); 
11829  });
11830 },
11831 executeOnDescription: function(description, ariaDescAttr, callback) {
11832  var descInfo = description[ariaDescAttr];
11833  if(ASPx.IsExists(descInfo))
11834   callback.aspxBind(this)(descInfo);
11835 },
11836 getNodesBySelector: function(element, selector) {
11837  var id = element.id || "";
11838  var childNodes = element.querySelectorAll("#" + this.getNodeId(element) + " > " + selector);
11839  ASPx.Attr.SetOrRemoveAttribute(element, "id", id);
11840  return childNodes;
11841 },
11842 getNodeId: function(node) {
11843  if(!node.id)
11844   node.id = this.createRandomId();
11845  return node.id; 
11846 },
11847 createRandomId: function() {
11848  return "r" + ASPx.CreateGuid();
11849 }
11850});
11851PagerCommands = {
11852 Next : "PBN",
11853 Prev : "PBP",
11854 Last : "PBL",
11855 First : "PBF",
11856 PageNumber : "PN",
11857 PageSize : "PSP"
11858};
11859ASPx.Callback = function(result, context){
11860 var collection = aspxGetControlCollection();
11861 collection.DoFinalizeCallback();
11862 var control = collection.Get(context);
11863 if(control != null)
11864  control.DoCallback(result);
11865 ASPx.RippleHelper.ReInit();
11866}
11867ASPx.CallbackError = function(result, context){
11868 var control = aspxGetControlCollection().Get(context);
11869 if(control != null)
11870  control.DoCallbackError(result, false);
11871}
11872ASPx.CClick = function(name, evt) {
11873 var control = aspxGetControlCollection().Get(name);
11874 if(control != null) control.DoControlClick(evt);
11875}
11876function aspxCAInit() {
11877 var isAppInit = typeof(Sys$_Application$initialize) != "undefined" &&
11878  ASPx.FunctionIsInCallstack(arguments.callee, Sys$_Application$initialize, 10 );
11879 aspxGetControlCollection().AtlasInitialize(!isAppInit);
11880}
11881ASPx.Evt.AttachEventToElement(window, "resize", aspxGlobalWindowResize);
11882function aspxGlobalWindowResize(evt){
11883 aspxGetControlCollection().OnBrowserWindowResize(evt); 
11884}
11885ASPx.Evt.AttachEventToElement(window.document, "DOMContentLoaded", aspxClassesDOMContentLoaded);
11886function aspxClassesDOMContentLoaded(evt){
11887 aspxGetControlCollection().DOMContentLoaded();
11888}
11889ASPx.GetControlCollection = aspxGetControlCollection;
11890ASPx.GetControlCollectionCollection = aspxGetControlCollectionCollection;
11891ASPx.GetPersistentControlPropertiesStorage = _aspxGetPersistentControlPropertiesStorage;
11892ASPx.PagerCommands = PagerCommands;
11893window.ASPxClientBeginCallbackEventArgs = ASPxClientBeginCallbackEventArgs;
11894window.ASPxClientGlobalBeginCallbackEventArgs = ASPxClientGlobalBeginCallbackEventArgs;
11895window.ASPxClientEndCallbackEventArgs = ASPxClientEndCallbackEventArgs;
11896window.ASPxClientGlobalEndCallbackEventArgs = ASPxClientGlobalEndCallbackEventArgs;
11897window.ASPxClientCallbackErrorEventArgs = ASPxClientCallbackErrorEventArgs;
11898window.ASPxClientGlobalCallbackErrorEventArgs = ASPxClientGlobalCallbackErrorEventArgs;
11899window.ASPxClientCustomDataCallbackEventArgs = ASPxClientCustomDataCallbackEventArgs;
11900window.ASPxClientValidationCompletedEventArgs = ASPxClientValidationCompletedEventArgs;
11901window.ASPxClientControlsInitializedEventArgs = ASPxClientControlsInitializedEventArgs;
11902window.ASPxClientControlBeforePronounceEventArgs = ASPxClientControlBeforePronounceEventArgs;
11903window.ASPxClientControlCollection = ASPxClientControlCollection;
11904window.ASPxClientControlBase = ASPxClientControlBase;
11905window.ASPxClientControl = ASPxClientControl;
11906window.ASPxClientComponent = ASPxClientComponent;
11907})();
11908(function () {
11909 var PositionAnimationTransition = ASPx.CreateClass(ASPx.AnimationTransitionBase, {
11910  constructor: function (element, options) {
11911   this.constructor.prototype.constructor.call(this, element, options);
11912   this.direction = options.direction;
11913   this.animationTransition = this.createAnimationTransition();
11914   AnimationHelper.appendWKAnimationClassNameIfRequired(this.element);
11915  },
11916  Start: function (to) {
11917   var from = this.GetValue();
11918   if(ASPx.AnimationUtils.CanUseCssTransform()) {
11919    from = this.convertPosToCssTransformPos(from);
11920    to = this.convertPosToCssTransformPos(to);
11921   }
11922   this.animationTransition.Start(from, to);
11923  },
11924  SetValue: function (value) {
11925   ASPx.AnimationUtils.SetTransformValue(this.element, value, this.direction == AnimationHelper.SLIDE_VERTICAL_DIRECTION);
11926  },
11927  GetValue: function () {
11928   return ASPx.AnimationUtils.GetTransformValue(this.element, this.direction == AnimationHelper.SLIDE_VERTICAL_DIRECTION);
11929  },
11930  createAnimationTransition: function () {
11931   var transition = ASPx.AnimationUtils.CanUseCssTransform() ? this.createTransformAnimationTransition() : this.createPositionAnimationTransition();
11932   transition.transition = ASPx.AnimationConstants.Transitions.POW_EASE_OUT;
11933   return transition;
11934  },
11935  createTransformAnimationTransition: function () {
11936   return ASPx.AnimationUtils.createCssAnimationTransition(this.element, {
11937    property: ASPx.AnimationUtils.CanUseCssTransform(),
11938    duration: this.duration,
11939    onComplete: this.onComplete
11940   });
11941  },
11942  createPositionAnimationTransition: function () {
11943   return AnimationHelper.createAnimationTransition(this.element, {
11944    property: this.direction == AnimationHelper.SLIDE_VERTICAL_DIRECTION ? "top" : "left",
11945    unit: "px",
11946    duration: this.duration,
11947    onComplete: this.onComplete
11948   });
11949  },
11950  convertPosToCssTransformPos: function (position) {
11951   return ASPx.AnimationUtils.GetTransformCssText(position, this.direction == AnimationHelper.SLIDE_VERTICAL_DIRECTION);
11952  }
11953 });
11954 var AnimationHelper = {
11955  SLIDE_HORIZONTAL_DIRECTION: 0,
11956  SLIDE_VERTICAL_DIRECTION: 1,
11957  SLIDE_TOP_DIRECTION: 0,
11958  SLIDE_RIGHT_DIRECTION: 1,
11959  SLIDE_BOTTOM_DIRECTION: 2,
11960  SLIDE_LEFT_DIRECTION: 3,
11961  SLIDE_CONTAINER_CLASS: "dxAC",
11962  MAXIMUM_DEPTH: 3,
11963  createAnimationTransition: function (element, options) {
11964   if(options.onStep) 
11965    options.animationEngine = "js";
11966   switch (options.animationEngine) {
11967    case "js":
11968     return ASPx.AnimationUtils.createJsAnimationTransition(element, options);
11969    case "css":
11970     return ASPx.AnimationUtils.createCssAnimationTransition(element, options);
11971    default:
11972     return ASPx.AnimationUtils.CanUseCssTransition() ? ASPx.AnimationUtils.createCssAnimationTransition(element, options) :
11973      ASPx.AnimationUtils.createJsAnimationTransition(element, options);
11974   }
11975  },
11976  createMultipleAnimationTransition: function (element, options) {
11977   return ASPx.AnimationUtils.createMultipleAnimationTransition(element, options);
11978  },
11979  createSimpleAnimationTransition: function (options) {
11980   return ASPx.AnimationUtils.createSimpleAnimationTransition(options);
11981  },
11982  cancelAnimation: function (element) {
11983   ASPx.AnimationTransitionBase.Cancel(element);
11984  },
11985  fadeIn: function (element, onComplete, duration) {
11986   AnimationHelper.fadeTo(element, {
11987    from: 0, to: 1,
11988    onComplete: onComplete,
11989    duration: duration || ASPx.AnimationConstants.Durations.DEFAULT
11990   });
11991  },
11992  fadeOut: function (element, onComplete, duration) {
11993   AnimationHelper.fadeTo(element, {
11994    from: ASPx.GetElementOpacity(element), to: 0,
11995    onComplete: onComplete,
11996    duration: duration || ASPx.AnimationConstants.Durations.DEFAULT
11997   });
11998  },
11999  fadeTo: function (element, options) {
12000   options.property = "opacity";
12001   if(!options.duration)
12002    options.duration = ASPx.AnimationConstants.Durations.SHORT;
12003   var transition = AnimationHelper.createAnimationTransition(element, options);
12004   if(!ASPx.IsExists(options.from))
12005    options.from = transition.GetValue();
12006   transition.Start(options.from, options.to);
12007  },
12008  slideIn: function (element, direction, onComplete, animationEngineType) {
12009   AnimationHelper.setOpacity(element, 1);
12010   var animationContainer = AnimationHelper.getSlideAnimationContainer(element, true, true);
12011   var pos = AnimationHelper.getSlideInStartPos(animationContainer, direction);
12012   var transition = AnimationHelper.createSlideTransition(animationContainer, direction,
12013    function (el) {
12014     AnimationHelper.resetSlideAnimationContainerSize(animationContainer);
12015     if(onComplete)
12016      onComplete(el);
12017    }, animationEngineType);
12018   transition.Start(pos, 0);
12019  },
12020  slideOut: function (element, direction, onComplete, animationEngineType) {
12021   var animationContainer = AnimationHelper.getSlideAnimationContainer(element, true, true);
12022   var pos = AnimationHelper.getSlideOutFinishPos(animationContainer, direction);
12023   var transition = AnimationHelper.createSlideTransition(animationContainer, direction,
12024    function (el) {
12025     AnimationHelper.setOpacity(el.firstChild, 0);
12026     if(onComplete)
12027      onComplete(el);
12028    }, animationEngineType);
12029   transition.Start(pos);
12030  },
12031  slideTo: function (element, options) {
12032   if(!ASPx.IsExists(options.direction))
12033    options.direction = AnimationHelper.SLIDE_HORIZONTAL_DIRECTION;
12034   var transition = new PositionAnimationTransition(element, options);
12035   transition.Start(options.to);
12036  },
12037  setOpacity: function (element, value) {
12038   ASPx.AnimationUtils.setOpacity(element, value);
12039  },
12040  appendWKAnimationClassNameIfRequired: function (element) {
12041   if(ASPx.AnimationUtils.CanUseCssTransform() && ASPx.Browser.WebKitFamily && !ASPx.ElementHasCssClass(element, "dx-wbv"))
12042    element.className += " dx-wbv";
12043  },
12044  findSlideAnimationContainer: function (element) {
12045   var container = element
12046   for(var i = 0; i < AnimationHelper.MAXIMUM_DEPTH; i++) {
12047    if(container.tagName == "BODY")
12048     return null;
12049    if(ASPx.ElementHasCssClass(container, AnimationHelper.SLIDE_CONTAINER_CLASS))
12050     return container;
12051    container = container.parentNode;
12052   }
12053   return null;
12054  },
12055  createSlideAnimationContainer: function (element) {
12056   var rootContainer = document.createElement("DIV");
12057   ASPx.SetStyles(rootContainer, {
12058    className: AnimationHelper.SLIDE_CONTAINER_CLASS,
12059    overflow: "hidden"
12060   });
12061   var elementContainer = document.createElement("DIV");
12062   rootContainer.appendChild(elementContainer);
12063   var parentNode = element.parentNode;
12064   parentNode.insertBefore(rootContainer, element);
12065   elementContainer.appendChild(element);
12066   return rootContainer;
12067  },
12068  getSlideAnimationContainer: function (element, create, fixSize) {
12069   if(!element) return;
12070   var width = element.offsetWidth;
12071   var height = element.offsetHeight;
12072   var container;
12073   if(element.className == AnimationHelper.SLIDE_CONTAINER_CLASS)
12074    container = element;
12075   if(!container)
12076    container = AnimationHelper.findSlideAnimationContainer(element);
12077   if(!container && create)
12078    container = AnimationHelper.createSlideAnimationContainer(element);
12079   if(container && fixSize) {
12080    ASPx.SetStyles(container, {
12081     width: width, height: height
12082    });
12083    ASPx.SetStyles(container.firstChild, {
12084     width: width, height: height
12085    });
12086   }
12087   return container;
12088  },
12089  resetSlideAnimationContainerSize: function (container) {
12090   ASPx.SetStyles(container, {
12091    width: "", height: ""
12092   });
12093   ASPx.SetStyles(container.firstChild, {
12094    width: "", height: ""
12095   });
12096  },
12097  getModifyProperty: function (direction) {
12098   if(direction == AnimationHelper.SLIDE_TOP_DIRECTION || direction == AnimationHelper.SLIDE_BOTTOM_DIRECTION)
12099    return "marginTop";
12100   return "marginLeft";
12101  },
12102  createSlideTransition: function (animationContainer, direction, complete, animationEngineType) {
12103   var animationEngine = "";
12104   switch(animationEngineType) {
12105    case AnimationEngineType.JS:
12106     animationEngine = "js";
12107     break;
12108    case AnimationEngineType.CSS:
12109     animationEngine = "css";
12110     break;
12111   }
12112   return AnimationHelper.createAnimationTransition(animationContainer.firstChild, {
12113    unit: "px",
12114    property: AnimationHelper.getModifyProperty(direction),
12115    onComplete: complete,
12116    animationEngine: animationEngine
12117   });
12118  },
12119  getSlideInStartPos: function (animationContainer, direction) {
12120   switch (direction) {
12121    case AnimationHelper.SLIDE_TOP_DIRECTION:
12122     return animationContainer.offsetHeight;
12123    case AnimationHelper.SLIDE_LEFT_DIRECTION:
12124     return animationContainer.offsetWidth;
12125    case AnimationHelper.SLIDE_RIGHT_DIRECTION:
12126     return -animationContainer.offsetWidth;
12127    case AnimationHelper.SLIDE_BOTTOM_DIRECTION:
12128     return -animationContainer.offsetHeight;
12129   }
12130  },
12131  getSlideOutFinishPos: function (animationContainer, direction) {
12132   switch (direction) {
12133    case AnimationHelper.SLIDE_TOP_DIRECTION:
12134     return -animationContainer.offsetHeight;
12135    case AnimationHelper.SLIDE_LEFT_DIRECTION:
12136     return -animationContainer.offsetWidth;
12137    case AnimationHelper.SLIDE_RIGHT_DIRECTION:
12138     return animationContainer.offsetWidth;
12139    case AnimationHelper.SLIDE_BOTTOM_DIRECTION:
12140     return animationContainer.offsetHeight;
12141   }
12142  }
12143 };
12144 var GestureHandler = ASPx.CreateClass(null, {
12145  constructor: function (getAnimationElement, canHandle, allowStart) {
12146   this.getAnimationElement = getAnimationElement;
12147   this.canHandle = canHandle;
12148   this.allowStart = allowStart;
12149   this.startMousePosX = 0;
12150   this.startMousePosY = 0;
12151   this.startTime = null;
12152   this.isEventsPrevented = false;
12153   this.savedElements = [];
12154  },
12155  OnSelectStart: function(evt) {
12156   ASPx.Evt.PreventEvent(evt); 
12157  },
12158  OnDragStart: function(evt) {
12159   ASPx.Evt.PreventEvent(evt);  
12160  },
12161  OnMouseDown: function (evt) {
12162   this.startMousePosX = ASPx.Evt.GetEventX(evt);
12163   this.startMousePosY = ASPx.Evt.GetEventY(evt);
12164   this.startTime = new Date();
12165  },
12166  OnMouseMove: function(evt) {
12167   if(!ASPx.Browser.MobileUI)
12168    ASPx.Selection.Clear();
12169   if(Math.abs(this.GetCurrentDistanceX(evt)) < GestureHandler.SLIDER_MIN_START_DISTANCE && Math.abs(this.GetCurrentDistanceY(evt)) < GestureHandler.SLIDER_MIN_START_DISTANCE)
12170    GesturesHelper.isExecutedGesture = false;
12171  },
12172  OnMouseUp: function (evt) {
12173  },
12174  CanHandleEvent: function (evt) {
12175   return !this.canHandle || this.canHandle(evt);
12176  },
12177  IsStartAllowed: function(value) {
12178   return !this.allowStart || this.allowStart(value);
12179  },
12180  RollbackGesture: function () {
12181  },
12182  GetRubberPosition: function (position) {
12183   return position / GestureHandler.FACTOR_RUBBER;
12184  },
12185  GetCurrentDistanceX: function (evt) {
12186   return ASPx.Evt.GetEventX(evt) - this.startMousePosX;
12187  },
12188  GetCurrentDistanceY: function (evt) {
12189   return ASPx.Evt.GetEventY(evt) - this.startMousePosY;
12190  },
12191  GetDistanceLimit: function () {
12192   return (new Date() - this.startTime) < GestureHandler.MAX_TIME_SPAN ? GestureHandler.MIN_DISTANCE_LIMIT : GestureHandler.MAX_DISTANCE_LIMIT;
12193  },
12194  GetContainerElement: function () {
12195  },
12196  AttachPreventEvents: function (evt) {
12197   if(!this.isEventsPrevented) {
12198    var element = ASPx.Evt.GetEventSource(evt);
12199    var container = this.GetContainerElement();
12200    while(element && element != container) {
12201     ASPx.Evt.AttachEventToElement(element, "mouseup", ASPx.Evt.PreventEvent);
12202     ASPx.Evt.AttachEventToElement(element, "click", ASPx.Evt.PreventEvent);
12203     this.savedElements.push(element);
12204     element = element.parentNode;
12205    }
12206    this.isEventsPrevented = true;
12207   }
12208  },
12209  DetachPreventEvents: function () {
12210   if(this.isEventsPrevented) {
12211    window.setTimeout(function () {
12212     while(this.savedElements.length > 0) {
12213      var element = this.savedElements.pop();
12214      ASPx.Evt.DetachEventFromElement(element, "mouseup", ASPx.Evt.PreventEvent);
12215      ASPx.Evt.DetachEventFromElement(element, "click", ASPx.Evt.PreventEvent);
12216     }
12217    }.aspxBind(this), 0);
12218    this.isEventsPrevented = false;
12219   }
12220  }
12221 });
12222 GestureHandler.MAX_DISTANCE_LIMIT = 70;
12223 GestureHandler.MIN_DISTANCE_LIMIT = 10;
12224 GestureHandler.MIN_START_DISTANCE = 0;
12225 GestureHandler.SLIDER_MIN_START_DISTANCE = 5;
12226 GestureHandler.MAX_TIME_SPAN = 300;
12227 GestureHandler.FACTOR_RUBBER = 4;
12228 GestureHandler.RETURN_ANIMATION_DURATION = 150;
12229 var SwipeSlideGestureHandler = ASPx.CreateClass(GestureHandler, {
12230  constructor: function (getAnimationElement, direction, canHandle, backward, forward, rollback, move) {
12231   this.constructor.prototype.constructor.call(this, getAnimationElement, canHandle);
12232   this.slideElement = this.getAnimationElement();
12233   this.container = this.slideElement.parentNode;
12234   this.direction = direction;
12235   this.backward = backward;
12236   this.forward = forward;
12237   this.rollback = rollback;
12238   this.slideElementSize = 0;
12239   this.containerElementSize = 0;
12240   this.startSliderElementPosition = 0;
12241   this.centeredSlideElementPosition = 0;
12242  },
12243  OnMouseDown: function (evt) {
12244   GestureHandler.prototype.OnMouseDown.call(this, evt);
12245   this.slideElementSize = this.GetElementSize();
12246   this.startSliderElementPosition = this.GetElementPosition();
12247   this.containerElementSize = this.GetContainerElementSize();
12248   if(this.slideElementSize <= this.containerElementSize)
12249    this.centeredSlideElementPosition = (this.containerElementSize - this.slideElementSize) / 2;
12250  },
12251  OnMouseMove: function (evt) {
12252   GestureHandler.prototype.OnMouseMove.call(this, evt);
12253   if(!ASPx.Browser.TouchUI && !ASPx.GetIsParent(this.container, ASPx.Evt.GetEventSource(evt))) {
12254    GesturesHelper.OnDocumentMouseUp(evt);
12255    return;
12256   }
12257   var distance = this.GetCurrentDistance(evt);
12258   if(Math.abs(distance) < GestureHandler.SLIDER_MIN_START_DISTANCE || ASPx.TouchUIHelper.isGesture)
12259    return;
12260   this.SetElementPosition(this.GetCalculatedPosition(distance));
12261   this.AttachPreventEvents(evt);
12262   ASPx.Evt.PreventEvent(evt);
12263  },
12264  GetCalculatedPosition: function (distance) {
12265   ASPx.AnimationTransitionBase.Cancel(this.slideElement);
12266   var position = this.startSliderElementPosition + distance,
12267    maxPosition = -(this.slideElementSize - this.containerElementSize),
12268    minPosition = 0;
12269   if(this.centeredSlideElementPosition > 0)
12270    position = this.GetRubberPosition(distance) + this.centeredSlideElementPosition;
12271   else if(position > minPosition)
12272    position = this.GetRubberPosition(distance);
12273   else if(position < maxPosition)
12274    position = this.GetRubberPosition(distance) + maxPosition;
12275   return position;
12276  },
12277  OnMouseUp: function (evt) {
12278   this.DetachPreventEvents();
12279   if(this.GetCurrentDistance(evt) != 0)
12280    this.OnMouseUpCore(evt);
12281  },
12282  OnMouseUpCore: function (evt) {
12283   var distance = this.GetCurrentDistance(evt);
12284   if(this.centeredSlideElementPosition > 0 || this.CheckSlidePanelIsOutOfBounds())
12285    this.PerformRollback();
12286   else
12287    this.PerformAction(distance);
12288  },
12289  PerformAction: function (distance) {
12290   if(Math.abs(distance) < this.GetDistanceLimit())
12291    this.PerformRollback();
12292   else if(distance < 0)
12293    this.PerformForward();
12294   else
12295    this.PerformBackward();
12296  },
12297  PerformBackward: function () {
12298   this.backward();
12299  },
12300  PerformForward: function () {
12301   this.forward();
12302  },
12303  PerformRollback: function () {
12304   this.rollback();
12305  },
12306  CheckSlidePanelIsOutOfBounds: function () {
12307   var minOffset = -(this.slideElementSize - this.containerElementSize), maxOffset = 0;
12308   var position = null, slideElementPos = this.GetElementPosition();
12309   if(slideElementPos > maxOffset || slideElementPos < minOffset)
12310    return true;
12311   return false;
12312  },
12313  GetContainerElement: function () {
12314   return this.container;
12315  },
12316  GetElementSize: function () {
12317   return this.IsHorizontalDirection() ? this.slideElement.offsetWidth : this.slideElement.offsetHeight;
12318  },
12319  GetContainerElementSize: function () {
12320   return this.IsHorizontalDirection() ? ASPx.GetClearClientWidth(this.container) : ASPx.GetClearClientHeight(this.container);
12321  },
12322  GetCurrentDistance: function (evt) {
12323   return this.IsHorizontalDirection() ? this.GetCurrentDistanceX(evt) : this.GetCurrentDistanceY(evt);
12324  },
12325  GetElementPosition: function () {
12326   return ASPx.AnimationUtils.GetTransformValue(this.slideElement, !this.IsHorizontalDirection());
12327  },
12328  SetElementPosition: function (position) {
12329   ASPx.AnimationUtils.SetTransformValue(this.slideElement, position, !this.IsHorizontalDirection());
12330  },
12331  IsHorizontalDirection: function () {
12332   return this.direction == AnimationHelper.SLIDE_HORIZONTAL_DIRECTION;
12333  }
12334 });
12335 var SwipeSimpleSlideGestureHandler = ASPx.CreateClass(SwipeSlideGestureHandler, {
12336  constructor: function (getAnimationElement, direction, canHandle, backward, forward, rollback, updatePosition) {
12337   this.constructor.prototype.constructor.call(this, getAnimationElement, direction, canHandle, backward, forward, rollback);
12338   this.container = this.slideElement;
12339   this.updatePosition = updatePosition;
12340   this.prevDistance = 0;
12341  },
12342  OnMouseDown: function (evt) {
12343   GestureHandler.prototype.OnMouseDown.call(this, evt);
12344   this.prevDistance = 0;
12345  },
12346  OnMouseUpCore: function (evt) {
12347   this.PerformAction(this.GetCurrentDistance(evt));
12348  },
12349  PerformAction: function (distance) {
12350   if(Math.abs(distance) < this.GetDistanceLimit())
12351    this.PerformRollback();
12352   else if(distance < 0)
12353    this.PerformForward();
12354   else
12355    this.PerformBackward();
12356  },
12357  GetCalculatedPosition: function (distance) {
12358   var position = distance - this.prevDistance;
12359   this.prevDistance = distance;
12360   return position;
12361  },
12362  SetElementPosition: function (position) {
12363   this.updatePosition(position);
12364  }
12365 });
12366 var SwipeGestureHandler = ASPx.CreateClass(GestureHandler, {
12367  constructor: function (getAnimationElement, canHandle, allowStart, start, allowComplete, complete, cancel, animationEngineType) {
12368   this.constructor.prototype.constructor.call(this, getAnimationElement, canHandle, allowStart);
12369   this.start = start;
12370   this.allowComplete = allowComplete;
12371   this.complete = complete;
12372   this.cancel = cancel;
12373   this.animationTween = null;
12374   this.currentDistanceX = 0;
12375   this.currentDistanceY = 0;
12376   this.tryStartGesture = false;
12377   this.tryStartScrolling = false;
12378   this.animationEngineType = animationEngineType;
12379   this.UpdateAnimationContainer();
12380  },
12381  UpdateAnimationContainer: function () {
12382   this.animationContainer = AnimationHelper.getSlideAnimationContainer(this.getAnimationElement(), true, false);
12383  },
12384  CanHandleEvent: function (evt) {
12385   if(GestureHandler.prototype.CanHandleEvent.call(this, evt))
12386    return true;
12387   return this.animationTween && this.animationContainer && ASPx.GetIsParent(this.animationContainer, ASPx.Evt.GetEventSource(evt));
12388  },
12389  OnMouseDown: function (evt) {
12390   GestureHandler.prototype.OnMouseDown.call(this, evt);
12391   if(this.animationTween)
12392    this.animationTween.Cancel();
12393   this.currentDistanceX = 0;
12394   this.currentDistanceY = 0;
12395   this.tryStartGesture = false;
12396   this.tryStartScrolling = false;
12397  },
12398  OnMouseMove: function (evt) {
12399   GestureHandler.prototype.OnMouseMove.call(this, evt);
12400   var isZoomGestureConflict = evt.touches && evt.touches.length > 1;
12401   if (isZoomGestureConflict)
12402    return false;
12403   this.currentDistanceX = this.GetCurrentDistanceX(evt);
12404   this.currentDistanceY = this.GetCurrentDistanceY(evt);
12405   if(!this.animationTween && !this.tryStartScrolling && (Math.abs(this.currentDistanceX) >
12406    GestureHandler.MIN_START_DISTANCE || Math.abs(this.currentDistanceY) > GestureHandler.MIN_START_DISTANCE)) {
12407    if(Math.abs(this.currentDistanceY) < Math.abs(this.currentDistanceX)) {
12408     this.tryStartGesture = true;
12409     if(this.IsStartAllowed(this.currentDistanceX)) {
12410      this.animationContainer = AnimationHelper.getSlideAnimationContainer(this.getAnimationElement(), true, true);
12411      this.animationTween = AnimationHelper.createSlideTransition(this.animationContainer, AnimationHelper.SLIDE_LEFT_DIRECTION,
12412       function () {
12413        AnimationHelper.resetSlideAnimationContainerSize(this.animationContainer);
12414        this.animationContainer = null;
12415        this.animationTween = null;
12416       }.aspxBind(this), this.animationEngineType);
12417      this.PerformStart(this.currentDistanceX);
12418      this.AttachPreventEvents(evt);
12419     }
12420    }
12421    else
12422     this.tryStartScrolling = true;
12423   }
12424   if(this.animationTween) {
12425    if(this.allowComplete && !this.allowComplete(this.currentDistanceX))
12426     this.currentDistanceX = this.GetRubberPosition(this.currentDistanceX);
12427    this.animationTween.SetValue(this.currentDistanceX);
12428   }
12429   if(!this.tryStartScrolling && !ASPx.TouchUIHelper.isGesture && evt.touches && evt.touches.length < 2)
12430    ASPx.Evt.PreventEvent(evt);
12431  },
12432  OnMouseUp: function (evt) {
12433   if(!this.animationTween) {
12434    if(this.tryStartGesture)
12435     this.PerformCancel(this.currentDistanceX);
12436   }
12437   else {
12438    if(Math.abs(this.currentDistanceX) < this.GetDistanceLimit())
12439     this.RollbackGesture();
12440    else {
12441     if(this.IsCompleteAllowed(this.currentDistanceX)) {
12442      this.PerformComplete(this.currentDistanceX);
12443      this.animationContainer = null;
12444      this.animationTween = null;
12445     }
12446     else
12447      this.RollbackGesture();
12448    }
12449   }
12450   this.DetachPreventEvents();
12451   this.tryStartGesture = false;
12452   this.tryStartScrolling = false;
12453  },
12454  PerformStart: function (value) {
12455   if(this.start)
12456    this.start(value);
12457  },
12458  IsCompleteAllowed: function (value) {
12459   return !this.allowComplete || this.allowComplete(value);
12460  },
12461  PerformComplete: function (value) {
12462   if(this.complete)
12463    this.complete(value);
12464  },
12465  PerformCancel: function (value) {
12466   if(this.cancel)
12467    this.cancel(value);
12468  },
12469  RollbackGesture: function () {
12470   this.animationTween.Start(this.currentDistanceX, 0);
12471  },
12472  ResetGestureElementPosition: function () {
12473   if (this.currentDistanceX === 0) return;
12474   var container = AnimationHelper.getSlideAnimationContainer(this.getAnimationElement());
12475   var onComplete = function () {  AnimationHelper.resetSlideAnimationContainerSize(container);  };
12476   var animation = AnimationHelper.createSlideTransition(container, AnimationHelper.SLIDE_LEFT_DIRECTION, onComplete, this.animationEngineType);
12477   animation.Start(this.currentDistanceX, 0);
12478  },
12479  GetContainerElement: function () {
12480   return this.animationContainer;
12481  }
12482 });
12483 var GesturesHelper = {
12484  handlers: {},
12485  activeHandler: null,
12486  isAttachedEvents: false,
12487  isExecutedGesture: false,
12488  AddSwipeGestureHandler: function (id, getAnimationElement, canHandle, allowStart, start, allowComplete, complete, cancel, animationEngineType) {
12489   this.handlers[id] = new SwipeGestureHandler(getAnimationElement, canHandle, allowStart, start, allowComplete, complete, cancel, animationEngineType);
12490  },
12491  UpdateSwipeAnimationContainer: function (id) {
12492   if(this.handlers[id])
12493    this.handlers[id].UpdateAnimationContainer();
12494  },
12495  AddSwipeSlideGestureHandler: function (id, getAnimationElement, direction, canHandle, backward, forward, rollback, updatePosition) {
12496   if(updatePosition)
12497    this.handlers[id] = new SwipeSimpleSlideGestureHandler(getAnimationElement, direction, canHandle, backward, forward, rollback, updatePosition);
12498   else
12499    this.handlers[id] = new SwipeSlideGestureHandler(getAnimationElement, direction, canHandle, backward, forward, rollback);
12500  },
12501  getParentDXEditorWithSwipeGestures: function(element) {
12502     return ASPx.GetParent(element, function(parent) {
12503      var parentObj = ASPx.GetControlCollection().Get(parent.id);
12504      return parentObj && parentObj.supportGestures && parentObj.isSwipeGesturesEnabled();
12505   });
12506  },
12507  canHandleMouseDown: function(evt) {
12508   if(!ASPx.Evt.IsLeftButtonPressed(evt))
12509    return false;
12510   var element = ASPx.Evt.GetEventSource(evt);
12511   var dxFocusedEditor = ASPx.Ident.scripts.ASPxClientEdit && ASPx.GetFocusedEditor();
12512   if(dxFocusedEditor && dxFocusedEditor.IsEditorElement(element)) {
12513    var elementParentDXEditorWithSwipeGestures = GesturesHelper.getParentDXEditorWithSwipeGestures(element);
12514    if(!elementParentDXEditorWithSwipeGestures || !dxFocusedEditor.IsEditorElement(elementParentDXEditorWithSwipeGestures))
12515     return false;
12516   }
12517   var isTextEditor = element.tagName == "TEXTAREA" || element.tagName == "INPUT" && ASPx.Attr.GetAttribute(element, "type") == "text";
12518   if(isTextEditor && document.activeElement == element)
12519    return false;
12520   return true;  
12521  },
12522  OnDocumentDragStart: function(evt) {
12523   if(GesturesHelper.activeHandler)
12524    GesturesHelper.activeHandler.OnDragStart(evt);
12525  },
12526  OnDocumentSelectStart: function(evt) {
12527   if(GesturesHelper.activeHandler)
12528    GesturesHelper.activeHandler.OnSelectStart(evt);
12529  },
12530  OnDocumentMouseDown: function (evt) {
12531   if(!GesturesHelper.canHandleMouseDown(evt))
12532    return;
12533   GesturesHelper.activeHandler = GesturesHelper.FindHandler(evt);
12534   if(GesturesHelper.activeHandler)
12535    GesturesHelper.activeHandler.OnMouseDown(evt);
12536  },
12537  OnDocumentMouseMove: function (evt) {
12538   if(GesturesHelper.activeHandler) {
12539    GesturesHelper.isExecutedGesture = true;
12540    GesturesHelper.activeHandler.OnMouseMove(evt);
12541   }
12542  },
12543  OnDocumentMouseUp: function (evt) {
12544   if(GesturesHelper.activeHandler) {
12545    GesturesHelper.activeHandler.OnMouseUp(evt);
12546    GesturesHelper.activeHandler = null;
12547    window.setTimeout(function () { GesturesHelper.isExecutedGesture = false; }, 0);
12548   }
12549  },
12550  AttachEvents: function () {
12551   if(!GesturesHelper.isAttachedEvents) {
12552    GesturesHelper.Attach(ASPx.Evt.AttachEventToElement);
12553    GesturesHelper.isAttachedEvents = true;
12554   }
12555  },
12556  DetachEvents: function () {
12557   if(GesturesHelper.isAttachedEvents) {
12558    GesturesHelper.Attach(ASPx.Evt.DetachEventFromElement);
12559    GesturesHelper.isAttachedEvents = false;
12560   }
12561  },
12562  Attach: function (changeEventsMethod) {
12563   var doc = window.document;
12564   changeEventsMethod(doc, ASPx.TouchUIHelper.touchMouseDownEventName, GesturesHelper.OnDocumentMouseDown);
12565   changeEventsMethod(doc, ASPx.TouchUIHelper.touchMouseMoveEventName, GesturesHelper.OnDocumentMouseMove);
12566   changeEventsMethod(doc, ASPx.TouchUIHelper.touchMouseUpEventName, GesturesHelper.OnDocumentMouseUp);
12567   if(!ASPx.Browser.MobileUI) {
12568    changeEventsMethod(doc, "selectstart", GesturesHelper.OnDocumentSelectStart);
12569    changeEventsMethod(doc, "dragstart", GesturesHelper.OnDocumentDragStart);
12570   }
12571  },
12572  FindHandler: function (evt) {
12573   var handlers = [];
12574   for(var id in GesturesHelper.handlers) {
12575    var handler = GesturesHelper.handlers[id];
12576    if(handler.CanHandleEvent && handler.CanHandleEvent(evt))
12577     handlers.push(handler);
12578   }
12579   if(!handlers.length)
12580    return null;
12581   handlers.sort(function (a, b) {
12582    return ASPx.GetIsParent(a.getAnimationElement(), b.getAnimationElement()) ? 1 : -1;
12583   });
12584   return handlers[0];
12585  },
12586  IsExecutedGesture: function () {
12587   return GesturesHelper.isExecutedGesture;
12588  }
12589 };
12590 GesturesHelper.AttachEvents();
12591 var AnimationEngineType = {
12592  "JS": 0,
12593  "CSS": 1,
12594  "DEFAULT" : 2
12595 }
12596 ASPx.AnimationEngineType = AnimationEngineType;
12597 ASPx.AnimationHelper = AnimationHelper;
12598 ASPx.GesturesHelper = GesturesHelper;
12599})();
12600(function() {
12601 var ASPxClientImageControlBase = ASPx.CreateClass(null, {
12602  constructor: function(control) {
12603   this.control = control;
12604   this.Initialize();
12605   this.CreateControlHierarchy();
12606   this.PrepareControlHierarchy();
12607   if(this.IsEnabled())
12608    this.InitializeHandlers();
12609  },
12610  Initialize: function() {
12611  },
12612  CreateControlHierarchy: function() {
12613  },
12614  PrepareControlHierarchy: function() {
12615  },
12616  AdjustControl: function() {
12617  },
12618  InitializeHandlers: function() {
12619  },
12620  IsEnabled: function() {
12621   return this.control.enabled;
12622  }
12623 });
12624 var ImageSizeModeEnum = {
12625  ActualSizeOrFit: 0,
12626  FitProportional: 1,
12627  FitAndCrop: 2
12628 };
12629 var RenderMode = {
12630  Image: 0,
12631  Canvas: 1
12632 };
12633 var Utils = {
12634  versions: {},
12635  GetKey: function(image) {
12636   return image.id + image.className;
12637  },
12638  RemoveLoadingGif: function(element) {
12639   ASPx.SetStyles(element, { backgroundImage: "url(" + ASPx.EmptyImageUrl + ")" });
12640  },
12641  IsImageLoaded: function(image) {
12642   return image.complete && ((ASPx.Browser.IE && ASPx.Browser.MajorVersion < 9) || image.naturalWi
12642dth !== undefined);
12643  },
12644  IsEmptyImageSource: function(image) {
12645   return !ASPx.Attr.GetAttribute(image, "src");
12646  },
12647  IsNotEmptyImageSize: function(image) {
12648   return image.naturalWidth && image.naturalHeight || image.width && image.height ? true : false;
12649  },
12650  TryGetImageSize: function(image, onComplete) {
12651   var fakeImage = new Image();
12652   ASPx.Evt.AttachEventToElement(fakeImage, "load", function(evt) {
12653    var img = evt.srcElement || this;
12654    image.width = fakeImage.width;
12655    image.height = fakeImage.height;
12656    image.naturalWidth = fakeImage.width;
12657    image.naturalHeight = fakeImage.height;
12658    onComplete();
12659   });
12660   fakeImage.src = image.src;
12661  },
12662  ChangeImageSource: function(image, src, onComplete) {
12663   var keyVersion = Utils.GetKey(image);
12664   Utils.versions[keyVersion] = (Utils.versions[keyVersion] + 1) || 0;
12665   var currentVersion = Utils.versions[keyVersion];
12666   var newImage = document.createElement("IMG");
12667   newImage.id = image.id;
12668   newImage.className = image.className;
12669   newImage.alt = image.alt;
12670   ASPx.Evt.AttachEventToElement(newImage, "load", function(evt) {
12671    if(Utils.versions[keyVersion] == currentVersion) {
12672     image.parentNode.appendChild(newImage);
12673     ASPx.RemoveElement(image);
12674     onComplete();
12675    }
12676   });
12677   newImage.src = src;
12678  }
12679 };
12680 var ResizeUtils = {
12681  ResizeImage: function(image, options) {
12682   if(ASPx.Browser.IE && ASPx.Browser.MajorVersion < 9 && !Utils.IsNotEmptyImageSize(image) || !Utils.IsNotEmptyImageSize(image)) 
12683    Utils.TryGetImageSize(image, function() { ResizeUtils.ResizeImageCore(image, options); });
12684   else
12685    ResizeUtils.ResizeImageCore(image, options);
12686  },
12687  ResizeImageCore: function(image, options) {
12688   var parent = image.parentNode;
12689   var canvas = ResizeUtils.GetCanvas(parent);
12690   var sizeMode = options.sizeMode == undefined ? ImageSizeModeEnum.ActualSizeOrFit : options.sizeMode;
12691   var properties = ResizeUtils.GetImageProperties(image.naturalWidth || image.width, image.naturalHeight || image.height, options.width, options.height, sizeMode);
12692   var useCanvas = properties.renderMode == RenderMode.Canvas && (options.canUseCanvas == undefined ? true : options.canUseCanvas);
12693   if(useCanvas) {
12694    if(canvas) {
12695     canvas.width = options.width;
12696     canvas.height = options.height;
12697     ResizeUtils.DrawImage(canvas, image, properties);
12698    }
12699    else {
12700     canvas = ResizeUtils.CreateCanvas(parent, options.width, options.height, image, properties);
12701     ASPx.RemoveElement(image);
12702    }
12703   }
12704   else {
12705    if(canvas)
12706     ASPx.RemoveElement(canvas);
12707    ResizeUtils.SetImageProperties(image, properties, options.rtl);
12708   }
12709   if(options.onEndResize)
12710    options.onEndResize(canvas || image, useCanvas);
12711  },
12712  SetImageProperties: function(image, properties, rtl) {
12713   var style = {
12714    marginTop: properties.y, display: ""
12715   };
12716   if(rtl)
12717    style.marginRight = properties.x;
12718   else
12719    style.marginLeft = properties.x;
12720   if(ASPx.Browser.IE && ASPx.Browser.MajorVersion < 9) {
12721    image.naturalWidth = image.width;
12722    image.naturalHeight = image.height;
12723   }
12724   image.width = properties.w;
12725   image.height = properties.h;
12726   ASPx.SetStyles(image, style);
12727  },
12728  GetImageProperties: function(naturalWidth, naturalHeight, width, height, sizeMode) {
12729   var properties = {};
12730   switch (sizeMode) {
12731    case ImageSizeModeEnum.FitAndCrop:
12732     properties = ResizeUtils.GetFitAndCropImageProperties(naturalWidth, naturalHeight, width, height);
12733     break;
12734    case ImageSizeModeEnum.FitProportional:
12735     properties = ResizeUtils.GetFitProportionalImageProperties(naturalWidth, naturalHeight, width, height);
12736     break;
12737    case ImageSizeModeEnum.ActualSizeOrFit:
12738     properties = ResizeUtils.GetActualSizeOrFitImageProperties(naturalWidth, naturalHeight, width, height);
12739     break;
12740   }
12741   properties.renderMode = RenderMode.Image;
12742   if(window.HTMLCanvasElement && (naturalWidth > width * 2 || naturalHeight > height * 2)) {
12743    if(ASPx.Browser.MacOSMobilePlatform && (naturalWidth > 2200 || naturalHeight > 2200)) 
12744     properties.renderMode = RenderMode.Image;
12745    else
12746     properties.renderMode = RenderMode.Canvas;
12747   }
12748   return properties;
12749  },
12750  GetFitAndCropImageProperties: function(naturalWidth, naturalHeight, width, height) {
12751   var ratio = naturalWidth / naturalHeight;
12752   naturalWidth = width;
12753   naturalHeight = naturalWidth / ratio;
12754   if(naturalHeight < height) {
12755    naturalHeight = height;
12756    naturalWidth = naturalHeight * ratio;
12757   }
12758   var left = -(naturalWidth - width) / 2;
12759   var top = -(naturalHeight - height) / 2;
12760   return ResizeUtils.CreateImagePropertiesObject(naturalWidth, naturalHeight, left, top);
12761  },
12762  GetFitProportionalImageProperties: function(naturalWidth, naturalHeight, width, height) {
12763   var ratio = naturalWidth / naturalHeight;
12764   naturalWidth = width;
12765   naturalHeight = naturalWidth / ratio;
12766   if(naturalHeight > height) {
12767    naturalHeight = height;
12768    naturalWidth = naturalHeight * ratio;
12769   }
12770   var left = (width - naturalWidth) / 2;
12771   var top = (height - naturalHeight) / 2;
12772   return ResizeUtils.CreateImagePropertiesObject(naturalWidth, naturalHeight, left, top);
12773  },
12774  GetActualSizeOrFitImageProperties: function(naturalWidth, naturalHeight, width, height) {
12775   if(naturalWidth > width || naturalHeight > height)
12776    return ResizeUtils.GetFitProportionalImageProperties(naturalWidth, naturalHeight, width, height);
12777   return ResizeUtils.CreateImagePropertiesObject(naturalWidth, naturalHeight, (width - naturalWidth) / 2, (height - naturalHeight) / 2);
12778  },
12779  CreateImagePropertiesObject: function(w, h, x, y) {
12780   var obj = { w: w, h: h, x: x, y: y };
12781   obj.w = Math.round(obj.w);
12782   obj.h = Math.round(obj.h);
12783   obj.x = Math.round(obj.x);
12784   obj.y = Math.round(obj.y);
12785   return obj;
12786  },
12787  GetCanvas: function (container) {
12788   return ASPx.GetChildByTagName(container, "CANVAS");
12789  },
12790  CreateCanvas: function(container, width, height, image, properties) {
12791   var canvas = document.createElement("CANVAS");
12792   canvas.width = width;
12793   canvas.height = height;
12794   container.appendChild(canvas);
12795   if(image && properties)
12796    ResizeUtils.DrawImage(canvas, image, properties);
12797   return canvas;
12798  },
12799  DrawImage: function(canvas, image, properties) {
12800   var context = canvas.getContext("2d");
12801   context.drawImage(image, properties.x, properties.y, properties.w, properties.h);
12802  }
12803 };
12804 ASPx.ImageControlUtils = {};
12805 ASPx.ImageControlUtils.ResizeImage = ResizeUtils.ResizeImage;
12806 ASPx.ImageControlUtils.RemoveLoadingGif = Utils.RemoveLoadingGif;
12807 ASPx.ImageControlUtils.IsImageLoaded = Utils.IsImageLoaded;
12808 ASPx.ImageControlUtils.IsEmptyImageSource = Utils.IsEmptyImageSource;
12809 ASPx.ImageControlUtils.IsNotEmptyImageSize = Utils.IsNotEmptyImageSize;
12810 ASPx.ImageControlUtils.ChangeImageSource = Utils.ChangeImageSource;
12811 ASPx.ImageControlUtils.TryGetImageSize = Utils.TryGetImageSize;
12812 ASPx.ImageControlUtils.ImageSizeModeEnum = ImageSizeModeEnum;
12813 window.ASPxClientImageControlBase = ASPxClientImageControlBase;
12814})();
12815(function () {
12816 var CssClassesConstants = {};
12817 CssClassesConstants.Prefix = "dxis-";
12818 CssClassesConstants.OverlayElementCssClass = CssClassesConstants.Prefix + "overlayElement";
12819 CssClassesConstants.TextAreaCssClassName = CssClassesConstants.Prefix + "itemTextArea";
12820 CssClassesConstants.ImageAreaSlidePanelCssClassName = CssClassesConstants.Prefix + "slidePanel";
12821 CssClassesConstants.NavigationBarHoverStateElementCssClassName = CssClassesConstants.Prefix + "nbHoverItem";
12822 CssClassesConstants.NavigationBarSelectedStateCssClassName = " " + CssClassesConstants.Prefix + "selected";
12823 CssClassesConstants.NavigationBarHoverStateCssClassName = CssClassesConstants.Prefix + "hover";
12824 CssClassesConstants.NavigationBarSlidePanelCssClassName = CssClassesConstants.Prefix + "nbSlidePanel";
12825 CssClassesConstants.NavigationBarSlidePanelWrapperCssClassName = CssClassesConstants.Prefix + "nbSlidePanelWrapper";
12826 CssClassesConstants.PassePartoutCssClassName = CssClassesConstants.Prefix + "passePartout";
12827 CssClassesConstants.ItemHyperLinkCssClassName = CssClassesConstants.Prefix + "hl";
12828 CssClassesConstants.PlayPauseWrapperCssClassName = CssClassesConstants.Prefix + "playPauseBtnWrapper";
12829 CssClassesConstants.NavigationButtonUpWrapperCssClassName = CssClassesConstants.Prefix + "prevBtnVertWrapper";
12830 CssClassesConstants.NavigationButtonDownWrapperCssClassName = CssClassesConstants.Prefix + "nextBtnVertWrapper";
12831 CssClassesConstants.NavigationButtonBackwardWrapperCssClassName = CssClassesConstants.Prefix + "prevBtnHorWrapper";
12832 CssClassesConstants.NavigationButtonForwardWrapperCssClassName = CssClassesConstants.Prefix + "nextBtnHorWrapper";
12833 CssClassesConstants.NavigationButtonUpOutsideWrapperCssClassName = CssClassesConstants.Prefix + "prevBtnVertOutsideWrapper";
12834 CssClassesConstants.NavigationButtonDownOutsideWrapperCssClassName = CssClassesConstants.Prefix + "nextBtnVertOutsideWrapper";
12835 CssClassesConstants.NavigationButtonBackwardOutsideWrapperCssClassName = CssClassesConstants.Prefix + "prevBtnHorOutsideWrapper";
12836 CssClassesConstants.NavigationButtonForwardOutsideWrapperCssClassName = CssClassesConstants.Prefix + "nextBtnHorOutsideWrapper";
12837 CssClassesConstants.NavigationButtonWrapperHoverCssClassPostfix = "Hover";
12838 CssClassesConstants.NavigationButtonWrapperPressedCssClassPostfix = "Pressed";
12839 CssClassesConstants.NavigationButtonWrapperDisabledCssClassPostfix = "Disabled";
12840 CssClassesConstants.ImageZoomNavigatorCssClassName = CssClassesConstants.Prefix + "zoomNavigator";
12841 CssClassesConstants.LoadingElement = "dx-is-loading";
12842 var LoadModeEnum = {
12843  AllImages: 0,
12844  DynamicLoadAndCache: 1,
12845  DynamicLoad: 2
12846 };
12847 var AnimationTypeEnum = {
12848  Slide: 0,
12849  Fade: 1,
12850  None: 2
12851 };
12852 var AnimationDirectionEnum = {
12853  Horizontal: 0,
12854  Vertical: 1
12855 };
12856 var NavigationBarPositionEnum = {
12857  Bottom: 0,
12858  Top: 1,
12859  Left: 2,
12860  Right: 3
12861 };
12862 var NavigationBarModeEnum = {
12863  Thumbnails: 0,
12864  Dots: 1
12865 };
12866 var ElementVisibilityModeEnum = {
12867  None: 0,
12868  Faded: 1,
12869  OnMouseOver: 2,
12870  Always: 3
12871 };
12872 var NavigationBarPagingModeEnum = {
12873  Page: 0,
12874  Single: 1
12875 };
12876 var ExtremeItemClickModeEnum = {
12877  SelectAndSlide: 0,
12878  Select: 1
12879 };
12880 var NavigationBarButtonPositionEnum = {
12881  Inside: 0,
12882  Outside: 1
12883 };
12884 var ActiveItemChangeActionEnum = {
12885  Click: 0,
12886  Hover: 1
12887 };
12888 var NavigationButtonVisibilityModeEnum = {
12889  Auto: 0,
12890  Always: 1
12891 };
12892 var FadedDefaultOpacity = 0.3;
12893 var SizeUtils = {
12894  GetClientWidth: function (element, clear) {
12895   return clear ? ASPx.GetClearClientWidth(element) : element.offsetWidth;
12896  },
12897  GetClientHeight: function (element, clear) {
12898   return clear ? ASPx.GetClearClientHeight(element) : element.offsetHeight;
12899  }
12900 };
12901 var MouseEnterHelper = {
12902  data: [],
12903  AddHandler: function (element, mouseOver, mouseOut) {
12904   var dataItem = this.GetDataItem(element);
12905   if(!dataItem)
12906    dataItem = this.CreateDataItem(element, mouseOver, mouseOut);
12907   dataItem.mouseOverHandlers.push(mouseOver);
12908   dataItem.mouseOutHandlers.push(mouseOut);
12909  },
12910  GetDataItem: function (element) {
12911   for(var i = 0; i < this.data.length; i++) {
12912    var dataItem = this.data[i];
12913    if(dataItem && dataItem.element == element)
12914     return dataItem;
12915   }
12916   return null;
12917  },
12918  CreateDataItem: function (element, mouseOver, mouseOut) {
12919   var dataItem = { element: element, mouseOverHandlers: [mouseOver], mouseOutHandlers: [mouseOut] };
12920   this.data.push(dataItem);
12921   ASPx.Evt.AttachMouseEnterToElement(element, MouseEnterHelper.OnMouseOverHandler, MouseEnterHelper.OnMouseOutHandler);
12922   return dataItem;
12923  },
12924  OnMouseOverHandler: function (element) {
12925   MouseEnterHelper.PerformHandlers(MouseEnterHelper.GetDataItem(element).mouseOverHandlers);
12926  },
12927  OnMouseOutHandler: function (element) {
12928   MouseEnterHelper.PerformHandlers(MouseEnterHelper.GetDataItem(element).mouseOutHandlers);
12929  },
12930  PerformHandlers: function (array) {
12931   for(var i = 0; i < array.length; i++)
12932    array[i]();
12933  }
12934 };
12935 var ControlBase = ASPx.CreateClass(ASPxClientImageControlBase, {
12936  constructor: function (imageSlider) {
12937   this.constructor.prototype.constructor.call(this, imageSlider);
12938  },
12939  AdjustControl: function () {
12940   this.CalculateSize();
12941  },
12942  ResetControlStyle: function () {
12943  },
12944  CalculateSize: function () {
12945  },
12946  InitializeHandlers: function () {
12947  },
12948  IsAdjustedSize: function () {
12949   return this.GetImageSlider().IsAdjusted();
12950  },
12951  GetImageSlider: function () {
12952   return this.control;
12953  },
12954  GetClientControlName: function () {
12955   return this.GetImageSlider().name;
12956  },
12957  IsHorizontalNavigation: function () {
12958   return this.GetImageSlider().navDirection == AnimationDirectionEnum.Horizontal;
12959  },
12960  GetAnimationType: function () {
12961   return this.GetImageSlider().GetAnimationType();
12962  },
12963  IsRtl: function (withoutHorizontalNavigation) {
12964   var value = !!this.GetImageSlider().rtl;
12965   if(!withoutHorizontalNavigation)
12966    value = value && this.IsHorizontalNavigation();
12967   return value;
12968  },
12969  CreateDiv: function () {
12970   return document.createElement("DIV");
12971  },
12972  GetStateController: function () {
12973   return typeof (ASPx.GetStateController) != "undefined" ? ASPx.GetStateController() : null;
12974  },
12975  PatchElementForMSTouch: function (element) {
12976   if(ASPx.Browser.MSTouchUI)
12977    element.className += " " + ASPx.TouchUIHelper.msTouchDraggableClassName;
12978  }
12979 });
12980 var ButtonBase = ASPx.CreateClass(ControlBase, {
12981  constructor: function (itemsOwner) {
12982   this.itemsOwner = itemsOwner;
12983   this.defaultOpacity = 0;
12984   this.isLeftButtonPressed = false;
12985   this.visibility = true;
12986   this.constructor.prototype.constructor.call(this, itemsOwner.GetImageSlider());
12987  },
12988  Initialize: function () {
12989   if(this.GetVisibilityMode() == ElementVisibilityModeEnum.Faded)
12990    this.defaultOpacity = FadedDefaultOpacity;
12991  },
12992  GetOwner: function () {
12993   return this.itemsOwner;
12994  },
12995  GetContainer: function () {
12996   return this.GetOwner().GetButtonsContainer()
12997  },
12998  GetMouseUpElement: function () {
12999   return this.GetContainer();
13000  },
13001  GetVisibilityMode: function () {
13002   return 0;
13003  },
13004  CanHandle: function () {
13005   return this.GetOwner().CanHandleButtons();
13006  },
13007  PrepareControlHierarchy: function () {
13008   if(this.GetVisibilityMode() == ElementVisibilityModeEnum.Always)
13009    return;
13010   var elements = this.GetAnimationElements();
13011   for(var i = 0; i < elements.length; i++) {
13012    ASPx.SetStyles(elements[i], { opacity: this.defaultOpacity });
13013    this.PatchElementForMSTouch(elements[i]);
13014   }
13015  },
13016  InitializeHandlers: function () {
13017   ASPx.Evt.AttachEventToElement(this.GetMouseUpElement(), ASPx.TouchUIHelper.touchMouseDownEventName, function (evt) {
13018    this.isLeftButtonPressed = ASPx.Evt.IsLeftButtonPressed(evt);
13019   }.aspxBind(this));
13020   ASPx.Evt.AttachEventToElement(this.GetMouseUpElement(), ASPx.Browser.TouchUI ? ASPx.TouchUIHelper.touchMouseUpEventName : "click", function (evt) {
13021    if(this.visibility && this.isLeftButtonPressed && this.CanHandle())
13022     this.OnMouseUp(evt);
13023   }.aspxBind(this));
13024   if(!ASPx.Browser.TouchUI && this.GetVisibilityMode() != ElementVisibilityModeEnum.Always)
13025    MouseEnterHelper.AddHandler(this.GetContainer(), function () { this.Appear() }.aspxBind(this), function () { this.Disappear() }.aspxBind(this));
13026  },
13027  OnMouseUp: function (evt) {
13028  },
13029  Appear: function () {
13030   this.Animate(1);
13031  },
13032  Disappear: function () {
13033   this.Animate(this.defaultOpacity);
13034  },
13035  GetAnimationElements: function () {
13036   return [];
13037  },
13038  Animate: function (value) {
13039   var elements = this.GetAnimationElements();
13040   var hasAnimation = this.GetAnimationType() != AnimationTypeEnum.None;
13041   for(var i = 0; i < elements.length; i++) {
13042    if(hasAnimation)
13043     ASPx.AnimationHelper.fadeTo(elements[i], { to: value });
13044    else
13045     ASPx.SetStyles(elements[i], { opacity: value });
13046   }
13047  },
13048  SetInnerHtml: function (element, html) {
13049   element.innerHTML = html;
13050  }
13051 });
13052 var SlideShowButton = ASPx.CreateClass(ButtonBase, {
13053  constructor: function (itemsOwner) {
13054   this.wrapperElement = null;
13055   this.playButton = null;
13056   this.pauseButton = null;
13057   this.itemsOwner = itemsOwner;
13058   this.constructor.prototype.constructor.call(this, itemsOwner);
13059  },
13060  GetMouseUpElement: function () {
13061   return this.wrapperElement;
13062  },
13063  GetAnimationElements: function () {
13064   return [this.wrapperElement];
13065  },
13066  GetVisibilityMode: function () {
13067   return this.GetImageSlider().playPauseBtnVbl;
13068  },
13069  CreateControlHierarchy: function () {
13070   var slider = this.GetImageSlider();
13071   this.wrapperElement = this.CreateDiv();
13072   this.wrapperElement.innerHTML = slider.playBH + slider.pauseBH;
13073   this.playButton = this.wrapperElement.children[0];
13074   this.pauseButton = this.wrapperElement.children[1];
13075   this.GetContainer().appendChild(this.wrapperElement);
13076  },
13077  PrepareControlHierarchy: function () {
13078   ButtonBase.prototype.PrepareControlHierarchy.call(this);
13079   this.wrapperElement.className = CssClassesConstants.PlayPauseWrapperCssClassName;
13080   this.SetButtonState(true);
13081  },
13082  IsPlaying: function () {
13083   return this.GetImageSlider().IsSlideShowPlaying();
13084  },
13085  OnMouseUp: function (evt) {
13086   var slider = this.GetImageSlider();
13087   if(this.IsPlaying())
13088    slider.Pause()
13089   else
13090    slider.Play()
13091  },
13092  SetButtonState: function (play) {
13093   ASPx.SetElementDisplay(this.playButton, play);
13094   ASPx.SetElementDisplay(this.pauseButton, !play);
13095  }
13096 });
13097 var NavigationButtons = ASPx.CreateClass(ButtonBase, {
13098  constructor: function (itemsOwner) {
13099   this.prevButtonEnable = true;
13100   this.nextButtonEnable = true;
13101   this.prevButton = null;
13102   this.nextButton = null;
13103   this.prevButtonWrapper = null;
13104   this.nextButtonWrapper = null;
13105   this.constructor.prototype.constructor.call(this, itemsOwner);
13106  },
13107  GetUniqueId: function () {
13108   return this.GetOwner().GetUniqueId();
13109  },
13110  IsEnablePagingByClick: function () {
13111   return this.GetOwner().IsEnablePagingByClick();
13112  },
13113  IsHorizontal: function () {
13114   return this.GetOwner().IsHorizontalNavigation();
13115  },
13116  GetVisibilityMode: function () {
13117   return this.GetOwner().GetNavigationBtnsVisibilityMode();
13118  },
13119  OnPrevButtonMouseUp: function (evt) {
13120   if(this.prevButtonEnable)
13121    this.GetOwner().PerformBackward();
13122   return ASPx.Evt.PreventEvent(evt);
13123  },
13124  OnNextButtonMouseUp: function (evt) {
13125   if(this.nextButtonEnable)
13126    this.GetOwner().PerformForward();
13127   return ASPx.Evt.PreventEvent(evt);
13128  },
13129  CreateControlHierarchy: function () {
13130   this.prevButtonWrapper = this.CreateDiv();
13131   this.nextButtonWrapper = this.CreateDiv();
13132   this.SetInnerHtml(this.prevButtonWrapper, this.GetOwner().GetPrevButtonHtml());
13133   this.SetInnerHtml(this.nextButtonWrapper, this.GetOwner().GetNextButtonHtml());
13134   this.prevButton = this.prevButtonWrapper.firstChild;
13135   this.nextButton = this.nextButtonWrapper.firstChild;
13136   var container = this.GetContainer();
13137   container.appendChild(this.prevButtonWrapper);
13138   container.appendChild(this.nextButtonWrapper);
13139  },
13140  PrepareControlHierarchy: function () {
13141   ButtonBase.prototype.PrepareControlHierarchy.call(this);
13142   this.SetId(this.prevButtonWrapper, "nbwb");
13143   this.SetId(this.nextButtonWrapper, "nbwf");
13144   this.PrepareButtonWrapper(this.prevButtonWrapper, this.GetPrevButtonWrapperCssClassName());
13145   this.PrepareButtonWrapper(this.nextButtonWrapper, this.GetNextButtonWrapperCssClassName());
13146  },
13147  GetPrevButtonWrapperCssClassName: function () {
13148   return this.IsHorizontal() ?
13149    CssClassesConstants.NavigationButtonBackwardWrapperCssClassName : CssClassesConstants.NavigationButtonUpWrapperCssClassName;
13150  },
13151  GetNextButtonWrapperCssClassName: function () {
13152   return this.IsHorizontal() ?
13153     CssClassesConstants.NavigationButtonForwardWrapperCssClassName : CssClassesConstants.NavigationButtonDownWrapperCssClassName;
13154  },
13155  PrepareButtonWrapper: function (wrapper, className) {
13156   wrapper.className = className;
13157   var stateController = this.GetStateController();
13158   if(stateController) {
13159    if(this.IsEnabled()) {
13160     stateController.AddHoverItem(wrapper.id, [className + CssClassesConstants.NavigationButtonWrapperHoverCssClassPostfix], [""], [""], null, null, false);
13161     stateController.AddPressedItem(wrapper.id, [className + CssClassesConstants.NavigationButtonWrapperPressedCssClassPostfix], [""], [""], null, null, false);
13162    }
13163    stateController.AddDisabledItem(wrapper.id, [className + CssClassesConstants.NavigationButtonWrapperDisabledCssClassPostfix], [""], [""], null, null, false);
13164   }
13165  },
13166  SetId: function (element, id) {
13167   element.id = this.GetClientControlName() + this.GetOwner().GetUniqueId() + id;
13168  },
13169  OnMouseUp: function (evt) {
13170   var value = true;
13171   var container = this.GetContainer();
13172   var source = ASPx.Evt.GetEventSource(evt);
13173   if(this.IsEnablePagingByClick() && !this.IsSlideShowButton(source) && !ASPx.IsInteractiveControl(source)) {
13174    var containerSize = this.IsHorizontal() ? container.offsetWidth : container.offsetHeight;
13175    var leftLimitPos = containerSize * 0.35,
13176     rightLimitPos = containerSize * 0.65;
13177    var mousePosInElement = this.IsHorizontal() ? ASPx.Evt.GetEventX(evt) - ASPx.GetAbsolutePositionX(container) : ASPx.Evt.GetEventY(evt) - ASPx.GetAbsolutePositionY(container);
13178    if(mousePosInElement < leftLimitPos)
13179     value = this.OnPrevButtonMouseUp(evt);
13180    else if(mousePosInElement > rightLimitPos)
13181     value = this.OnNextButtonMouseUp(evt);
13182   }
13183   else {
13184    if(source == this.prevButtonWrapper || source == this.prevButton)
13185     value = this.OnPrevButtonMouseUp(evt);
13186    else if(source == this.nextButtonWrapper || source == this.nextButton)
13187     value = this.OnNextButtonMouseUp(evt);
13188   }
13189   return value;
13190  },
13191  IsSlideShowButton: function (element) {
13192   var className = CssClassesConstants.PlayPauseWrapperCssClassName;
13193   return element.className == className || element.parentNode.className == className;
13194  },
13195  SetEnablePrevButton: function (enable) {
13196   this.prevButtonEnable = enable;
13197   var stateController = this.GetStateController();
13198   if(stateController) {
13199    stateController.SetElementEnabled(this.prevButtonWrapper, enable);
13200    stateController.SetElementEnabled(this.prevButton, enable);
13201   }
13202  },
13203  SetEnableNextButton: function (enable) {
13204   this.nextButtonEnable = enable;
13205   var stateController = this.GetStateController();
13206   if(stateController) {
13207    stateController.SetElementEnabled(this.nextButtonWrapper, enable);
13208    stateController.SetElementEnabled(this.nextButton, enable);
13209   }
13210  },
13211  SetVisibilityButtons: function (visible) {
13212   if(this.visibility == visible)
13213    return;
13214   this.visibility = visible;
13215   ASPx.SetElementDisplay(this.prevButtonWrapper, this.visibility);
13216   ASPx.SetElementDisplay(this.nextButtonWrapper, this.visibility);
13217  },
13218  GetVisibilityButtons: function () {
13219   return this.visibility;
13220  },
13221  GetAnimationElements: function () {
13222   return [this.prevButtonWrapper, this.nextButtonWrapper];
13223  },
13224  GetPrevButtonWrapperSize: function () {
13225   return this.GetButtonSize(this.prevButtonWrapper);
13226  },
13227  GetNextButtonWrapperSize: function () {
13228   return this.GetButtonSize(this.nextButtonWrapper);
13229  },
13230  GetButtonSize: function (element) {
13231   return { width: element.offsetWidth, height: element.offsetHeight };
13232  }
13233 });
13234 var OutsideNavigationButtons = ASPx.CreateClass(NavigationButtons, {
13235  constructor: function (itemsOwner) {
13236   this.constructor.prototype.constructor.call(this, itemsOwner);
13237  },
13238  GetAnimationElements: function () {
13239   return [];
13240  },
13241  GetPrevButtonWrapperCssClassName: function () {
13242   return this.IsHorizontal() ?
13243    CssClassesConstants.NavigationButtonBackwardOutsideWrapperCssClassName : CssClassesConstants.NavigationButtonUpOutsideWrapperCssClassName;
13244  },
13245  GetNextButtonWrapperCssClassName: function () {
13246   return this.IsHorizontal() ?
13247     CssClassesConstants.NavigationButtonForwardOutsideWrapperCssClassName : CssClassesConstants.NavigationButtonDownOutsideWrapperCssClassName;
13248  }
13249 });
13250 var ItemsOwnerBase = ASPx.CreateClass(ControlBase, {
13251  constructor: function (imageSlider) {
13252   this.activeItemIndex = 0;
13253   this.prevItemIndex = -1;
13254   this.fullItemWidth = 0;
13255   this.fullItemHeight = 0;
13256   this.clearItemWidth = 0;
13257   this.clearItemHeight = 0;
13258   this.itemElementsManager = null; 
13259   this.navigationButtons = null; 
13260   this.slidePanelElement = null;
13261   this.constructor.prototype.constructor.call(this, imageSlider);
13262  },
13263  Initialize: function () {
13264   this.activeItemIndex = this.GetRtlIndex(this.GetImageSlider().activeItemIndex);
13265   if(this.IsRtl())
13266    this.prevItemIndex = this.activeItemIndex + 1;
13267  },
13268  GetRtlIndex: function (index) {
13269   if(this.IsRtl())
13270    return this.GetItemCount() - 1 - index;
13271   return index;
13272  },
13273  ForEachItem: function (func) {
13274   var count = this.GetItemCount();
13275   if(!this.IsRtl()) {
13276    for(var i = 0; i < count ; i++)
13277     func.call(this, i);
13278   }
13279   else {
13280    for(var i = count - 1; i >= 0; i--)
13281     func.call(this, i);
13282   }
13283  },
13284  GetUniqueId: function () {
13285   return "";
13286  },
13287  IsAccessibilityCompliant: function () {
13288   return this.GetImageSlider().accessibilityCompliant;
13289  },
13290  GetItemElementsManager: function () {
13291   if(!this.itemElementsManager)
13292    this.itemElementsManager = this.CreateItemElementsManager();
13293   return this.itemElementsManager;
13294  },
13295  CreateItemElementsManager: function () {
13296   return new ItemElementsManagerBase(this);
13297  },
13298  GetTemplate: function (index) {
13299   return this.IsValidItemIndex(index) ? this.GetItem(index).tpl : null;
13300  },
13301  GetNavigateUrl: function (index) {
13302   return this.IsValidItemIndex(index) ? this.GetItem(index).u : null;
13303  },
13304  GetImageSrc: function (index) {
13305   return this.IsValidItemIndex(index) ? this.GetItem(index).s : null;
13306  },
13307  GetItemAlternateText: function (index) {
13308   if(this.IsValidItemIndex(index)) {
13309    var item = this.GetItem(index);
13310    return item.t || item.at || "";
13311   }
13312   return "";
13313  },
13314  GetItem: function (index) {
13315   return this.GetImageSlider().GetItemInternal(this.GetRtlIndex(index));
13316  },
13317  GetItemCount: function () {
13318   return this.GetImageSlider().GetItemCount();
13319  },
13320  SetActiveItemIndex: function (index, preventAnimation) {
13321   if(!this.IsEnabled() || !this.IsValidItemIndex(index) || index == this.GetActiveItemIndex())
13322    return;
13323   this.prevItemIndex = this.GetActiveItemIndex();
13324   this.activeItemIndex = index;
13325   this.SetActiveItemIndexInternal(index, preventAnimation);
13326  },
13327  SetActiveItemIndexInternal: function (index, preventAnimation) {
13328   this.UpdateNavigationButtonsState();
13329  },
13330  GetActiveItemIndex: function () {
13331   return this.activeItemIndex;
13332  },
13333  GetPrevItemIndex: function () {
13334   return this.prevItemIndex;
13335  },
13336  GetItemElement: function (index) {
13337   return this.IsValidItemIndex(index) ? this.GetItemElementsManager().GetCollection()[index] : null;
13338  },
13339  GetImageElement: function (index) {
13340   return ASPx.GetChildByTagName(this.GetItemElement(index), "IMG");
13341  },
13342  GetCanvasElement: function (index) {
13343   return ASPx.GetChildByTagName(this.GetItemElement(index), "CANVAS");
13344  },
13345  GetHyperLinkElement: function (index) {
13346   return ASPx.GetChildByClassName(this.GetItemElement(index), CssClassesConstants.ItemHyperLinkCssClassName);
13347  },
13348  GetImageContainerElement: function (index) {
13349   return this.GetHyperLinkElement(index) || this.GetItemElement(index);
13350  },
13351  GetItemElementSize: function (clear) {
13352   return this.IsHorizontalNavigation() ? this.GetItemElementWidth(clear) : this.GetItemElementHeight(clear);
13353  },
13354  GetItemElementWidth: function (clear) {
13355   return clear ? this.clearItemWidth : this.fullItemWidth;
13356  },
13357  GetItemElementHeight: function (clear) {
13358   return clear ? this.clearItemHeight : this.fullItemHeight;
13359  },
13360  GetSlidePanelElement: function () {
13361   return this.slidePanelElement;
13362  },
13363  GetItemsContainer: function () {
13364   return null;
13365  },
13366  StopPlayingWhenPaging: function () {
13367   this.GetImageSlider().StopPlayingWhenPaging();
13368  },
13369  CanCreateNavigationButtons: function () {
13370   return true;
13371  },
13372  CreateNavigationButtons: function () {
13373   if(this.GetNavigationBtnsVisibilityMode() == ElementVisibilityModeEnum.None)
13374    return null;
13375   return new NavigationButtons(this);
13376  },
13377  GetNavigationBtnsVisibilityMode: function () {
13378   return this.GetImageSlider().navBtnsVbl;
13379  },
13380  UpdateNavigationButtonsState: function () {
13381   return false;
13382  },
13383  GetButtonsContainer: function () {
13384   return null;
13385  },
13386  GetPrevButtonHtml: function () {
13387   return "";
13388  },
13389  GetNextButtonHtml: function () {
13390   return "";
13391  },
13392  CanHandleButtons: function () {
13393   return !this.IsExecutedGesture();
13394  },
13395  IsExecutedGesture: function () {
13396   return ASPx.GesturesHelper.IsExecutedGesture();
13397  },
13398  IsEnablePagingByClick: function () {
13399   return false;
13400  },
13401  SetEnablePrevButton: function (enabled) {
13402   if(this.navigationButtons)
13403    this.navigationButtons.SetEnablePrevButton(enabled);
13404  },
13405  SetEnableNextButton: function (enabled) {
13406   if(this.navigationButtons)
13407    this.navigationButtons.SetEnableNextButton(enabled);
13408  },
13409  SetVisibilityButtons: function (visible) {
13410   if(this.navigationButtons)
13411    this.navigationButtons.SetVisibilityButtons(visible);
13412  },
13413  PerformBackward: function () {
13414  },
13415  PerformForward: function () {
13416  },
13417  PerformRollBack: function () {
13418  },
13419  GetEnableLoopNavigation: function () {
13420   return false;
13421  },
13422  GetImageLoadMode: function () {
13423   return this.GetImageSlider().imageLoadMode;
13424  },
13425  UpdateItemElementsIfRequired: function () {
13426   this.GetItemElementsManager().UpdateHierarchyIfRequired();
13427  },
13428  UpdateItemElementsAfterDelayIfRequired: function () {
13429   this.GetItemElementsManager().UpdateHierarchyAfterDelayIfRequired();
13430  },
13431  IsNeedCreateHyperLink: function () {
13432   return true;
13433  },
13434  GetTarget: function () {
13435   return this.GetImageSlider().target;
13436  },
13437  CreateTemplates: function () {
13438   this.ForEachItem(function (i) {
13439    var template = this.GetTemplate(i);
13440    if(template) {
13441     var itemElement = this.GetItemElement(i);
13442     var child = itemElement.firstChild ? itemElement.firstChild.cloneNode(true) : null;
13443     itemElement.innerHTML = template;
13444     if(child)
13445      itemElement.appendChild(child);
13446    }
13447   });
13448  },
13449  CreateControlHierarchy: function () {
13450   this.CreateControlHierarchyInternal();
13451   if(this.CanCreateNavigationButtons())
13452    this.navigationButtons = this.CreateNavigationButtons();
13453   this.GetItemElementsManager().CreateItemsIfRequired();
13454  },
13455  CreateControlHierarchyInternal: function () {
13456  },
13457  CreateItemElements: function () {
13458   this.ForEachItem(function (i) {
13459    this.GetItemsContainer().appendChild(this.CreateItemElement(i));
13460   });
13461  },
13462  CreateItemElement: function (index) {
13463   var itemElement = this.CreateDiv();
13464   if(!this.GetTemplate(index)) {
13465    var hyperLinkElement = this.CreateHyperLinkElement(index);
13466    if(hyperLinkElement)
13467     itemElement.appendChild(hyperLinkElement);
13468   }
13469   return itemElement;
13470  },
13471  CreateImageElement: function (index) {
13472   var image = new Image();
13473   ASPx.SetElementDisplay(image, false);
13474   this.AttachLoadEvent(image);
13475   this.GetImageContainerElement(index).appendChild(image);
13476   image.dxIndex = index;
13477   image.dxImageSlider = this;
13478   image.src = this.GetImageSrc(index);
13479   image.alt = this.IsAccessibilityCompliant() ? this.GetItemAlternateText(index) : "";
13480   return image;
13481  },
13482  CreateHyperLinkElement: function (index) {
13483   var url = this.GetNavigateUrl(index);
13484   if(!this.IsNeedCreateHyperLink() || !url)
13485    return null;
13486   var element = document.createElement("A");
13487   element.target = this.GetTarget();
13488   element.className = CssClassesConstants.ItemHyperLinkCssClassName;
13489   element.href = url;
13490   return element;
13491  },
13492  PrepareControlHierarchy: function () {
13493   this.GetItemElementsManager().PrepareItemsIfRequired();
13494  },
13495  PrepareItemElements: function () {
13496   this.ForEachItem(function (i) {
13497    this.PrepareItemElement(i);
13498   });
13499  },
13500  PrepareItemElement: function (index) {
13501   var itemElement = this.GetItemElement(index);
13502   ASPx.SetStyles(itemElement, {
13503    className: this.GetItemElementCssClass(),
13504    cssText: this.GetItemElementStyle()
13505   });
13506   if(this.GetTemplate(index))
13507    ASPx.ImageControlUtils.RemoveLoadingGif(itemElement);
13508  },
13509  AdjustControl: function () {
13510   ControlBase.prototype.AdjustControl.call(this);
13511   if(this.navigationButtons)
13512    this.navigationButtons.AdjustControl();
13513   this.AdjustControlInternal();
13514   this.SetActiveItemIndexInternal(this.GetActiveItemIndex(), true);
13515  },
13516  AdjustControlInternal: function () {
13517   this.AdjustItemElements();
13518  },
13519  AdjustItemElements: function () {
13520   this.GetItemElementsManager().AdjustItemsIfRequired();
13521  },
13522  CalculateSize: function () {
13523   var fakeElement = this.CreateDiv();
13524   ASPx.SetStyles(fakeElement, {
13525    className: this.GetItemElementCssClass(),
13526    cssText: this.GetItemElementStyle()
13527   });
13528   this.CalculateItemElementSize(fakeElement);
13529   ASPx.RemoveElement(fakeElement);
13530  },
13531  CalculateItemElementSize: function (element) {
13532  },
13533  AdjustItemElement: function (index) {
13534   ASPx.SetStyles(this.GetItemElement(index), {
13535    width: this.GetItemElementWidth(true),
13536    height: this.GetItemElementHeight(true)
13537   });
13538  },
13539  AdjustImageElement: function (index) {
13540   if(this.GetTemplate(index) || !this.GetImageSrc(index))
13541    return;
13542   var image = this.GetImageElement(index);
13543   if(!image)
13544    image = this.CreateImageElement(index);
13545   else if(ASPx.ImageControlUtils.IsImageLoaded(image))
13546    this.ResizeImage(image, index);
13547  },
13548  GetItemElementCssClass: function () {
13549   return "";
13550  },
13551  GetItemElementStyle: function () {
13552   return "";
13553  },
13554  ResizeImage: function (image, index) {
13555   ASPx.ImageControlUtils.ResizeImage(image, {
13556    width: this.GetItemElementWidth(true),
13557    height: this.GetItemElementHeight(true),
13558    sizeMode: this.GetImageSizeMode(),
13559    rtl: this.IsRtl(true),
13560    onEndResize: function(element, isCanvas) {
13561     if(isCanvas)
13562      this.PrepareCanvasElement(index);
13563    }.aspxBind(this),
13564    canUseCanvas: !this.IsAccessibilityCompliant()
13565   });
13566  },
13567  PrepareCanvasElement: function (index) {
13568  },
13569  GetImageSizeMode: function () {
13570   return this.GetImageSlider().imageSizeMode;
13571  },
13572  GetSwipeGestureElement: function () {
13573   return this.GetSlidePanelElement();
13574  },
13575  CanCreateSwipeGestureHandler: function () {
13576   return false;
13577  },
13578  CreateSwipeGestureHandler: function () {
13579   ASPx.GesturesHelper.AddSwipeSlideGestureHandler(
13580    this.GetClientControlName() + this.GetUniqueId(),
13581    function () { return this.GetSwipeGestureElement(); }.aspxBind(this),
13582    this.IsHorizontalNavigation() ? ASPx.AnimationHelper.SLIDE_HORIZONTAL_DIRECTION : ASPx.AnimationHelper.SLIDE_VERTICAL_DIRECTION,
13583    function (evt) { return this.CanHandleSwipeGesture(evt); }.aspxBind(this),
13584    function () { this.PerformBackward(); }.aspxBind(this),
13585    function () { this.PerformForward(); }.aspxBind(this),
13586    function () { this.PerformRollBack(); }.aspxBind(this)
13587   );
13588  },
13589  CanHandleSwipeGesture: function (evt) {
13590   return !!ASPx.GetIsParent(this.GetSwipeGestureElement(), ASPx.Evt.GetEventSource(evt));
13591  },
13592  InitializeHandlers: function () {
13593   if(this.GetImageSlider().allowMouseWheel && !(ASPx.Browser.Edge && ASPx.Browser.MSTouchUI))
13594    ASPx.Evt.AttachEventToElement(this.GetItemsContainer(), ASPx.Evt.GetMouseWheelEventName(), function (evt) { this.OnMouseWheel(evt); }.aspxBind(this));
13595   if(this.CanCreateSwipeGestureHandler() && this.GetImageSlider().enablePagingGestures)
13596    this.CreateSwipeGestureHandler();
13597  },
13598  AttachLoadEvent: function (image) {
13599   ASPx.Evt.AttachEventToElement(image, "load", _onImageLoad);
13600  },
13601  DetachLoadEvents: function (image) {
13602   ASPx.Evt.DetachEventFromElement(image, "load", _onImageLoad);
13603  },
13604  OnMouseWheel: function (evt) {
13605   if(!this.IsFocused())
13606    return;
13607   if(ASPx.Evt.GetWheelDelta(evt) > 0)
13608    this.PerformBackward();
13609   else
13610    this.PerformForward();
13611   return ASPx.Evt.PreventEvent(evt);
13612  },
13613  OnImageLoad: function (image) {
13614   this.InitializeImage(image);
13615   this.ResizeImage(image, image.dxIndex);
13616   ASPx.ImageControlUtils.RemoveLoadingGif(this.GetItemElement(image.dxIndex));
13617  },
13618  InitializeImage: function (image) {
13619   if(image.naturalWidth && image.naturalHeight)
13620    return;
13621   image.naturalWidth = image.width;
13622   image.naturalHeight = image.height;
13623  },
13624  GetElementTransformPosition: function (element) {
13625   return ASPx.AnimationUtils.GetTransformValue(element, !this.IsHorizontalNavigation());
13626  },
13627  SetElementTransformPosition: function (element, position) {
13628   ASPx.AnimationUtils.SetTransformValue(element, position, !this.IsHorizontalNavigation());
13629  },
13630  GetWidth: function () {
13631   return 0;
13632  },
13633  GetHeight: function () {
13634   return 0;
13635  },
13636  IsFocused: function () {
13637   return this.GetImageSlider().IsFocused();
13638  },
13639  CreateDocumentFragment: function () {
13640   var fragment = null;
13641   if(document.createDocumentFragment)
13642    fragment = document.createDocumentFragment();
13643   return fragment;
13644  },
13645  IsValidItemIndex: function (index) {
13646   if(index >= 0 && index < this.GetItemCount())
13647    return true;
13648   return false;
13649  }
13650 });
13651 function _onImageLoad(evt) {
13652  var image = evt.srcElement || this;
13653  if(!image.dxImageSlider)
13654   return;
13655  var imageSlider = image.dxImageSlider;
13656  imageSlider.DetachLoadEvents(image);
13657  if(!image.parentNode) return;
13658  imageSlider.OnImageLoad(image);
13659 }
13660 var ImageAreaStrategy = ASPx.CreateClass(ItemsOwnerBase, {
13661  constructor: function (imageSlider) {
13662   this.currentItemTextElementOpacity = 0;
13663   this.defaultItemTextElementOpacity = 0;
13664   this.touchDeviceElementsVisible = false;
13665   this.imageAreaStyleSize = { width: "", height: "" };
13666   this.imageAreaElement = null;
13667   this.slideShowButton = null; 
13668   this.overlayLinkElement = null;
13669   this.overlayImageElement = null;
13670   this.constructor.prototype.constructor.call(this, imageSlider);
13671  },
13672  Initialize: function () {
13673   ItemsOwnerBase.prototype.Initialize.call(this);
13674   if(this.GetItemTextVisibilityMode() == ElementVisibilityModeEnum.Faded)
13675    this.defaultItemTextElementOpacity = FadedDefaultOpacity;
13676   else if(ASPx.Browser.Firefox)
13677    this.defaultItemTextElementOpacity = 0.01; 
13678   this.currentItemTextElementOpacity = this.defaultItemTextElementOpacity;
13679  },
13680  GetUniqueId: function () {
13681   return "_ia_";
13682  },
13683  CreateItemElementsManager: function () {
13684   return new ImageAreaItemElementsManager(this);
13685  },
13686  GetTextTemplate: function (index) {
13687   return this.GetItem(index).ttpl;
13688  },
13689  GetItemText: function (index) {
13690   return this.IsValidItemIndex(index) ? this.GetItem(index).t : null;
13691  },
13692  SetSlideShowButtonState: function (play) {
13693   if(this.slideShowButton)
13694    this.slideShowButton.SetButtonState(play);
13695  },
13696  IsEnablePagingByClick: function () {
13697   return this.GetImageSlider().enablePagingByClick;
13698  },
13699  GetButtonsContainer: function () {
13700   return this.GetImageSlider().GetPassePartoutElement();
13701  },
13702  GetPrevButtonHtml: function () {
13703   return this.GetImageSlider().pbh;
13704  },
13705  GetNextButtonHtml: function () {
13706   return this.GetImageSlider().nbh;
13707  },
13708  UpdateNavigationButtonsState: function () {
13709   if(this.navigationButtons) {
13710    if(this.GetItemCount() == 1)
13711     this.SetVisibilityButtons(false);
13712    else {
13713     var currentItemIndex = this.GetActiveItemIndex();
13714     this.SetEnablePrevButton(currentItemIndex != 0);
13715     this.SetEnableNextButton(currentItemIndex != this.GetItemCount() - 1);
13716    }
13717   }
13718   return false;
13719  },
13720  PerformBackward: function () {
13721   this.StopPlayingWhenPaging();
13722   var index = this.GetActiveItemIndex();
13723   index--;
13724   if(index < 0 && this.GetEnableLoopNavigation())
13725    index = this.GetItemCount() - 1;
13726   this.GetImageSlider().SetActiveItemIndexInternal(index);
13727  },
13728  PerformForward: function () {
13729   this.StopPlayingWhenPaging();
13730   var index = this.GetActiveItemIndex();
13731   index++;
13732   if(index == this.GetItemCount() && this.GetEnableLoopNavigation())
13733    index = 0;
13734   this.GetImageSlider().SetActiveItemIndexInternal(index);
13735  },
13736  PerformRollBack: function () {
13737   this.SetActiveItemIndexInternal(this.GetActiveItemIndex(), false);
13738  },
13739  CreateControlHierarchy: function () {
13740   ItemsOwnerBase.prototype.CreateControlHierarchy.call(this);
13741   this.CreateOverlayElements();
13742  },
13743  CreateTemplates: function () {
13744   ItemsOwnerBase.prototype.CreateTemplates.call(this);
13745   this.ForEachItem(function (i) {
13746    var template = this.GetTextTemplate(i);
13747    if(template)
13748     this.GetItemTextElement(i).innerHTML = template;
13749   });
13750  },
13751  CreateControlHierarchyInternal: function () {
13752   ItemsOwnerBase.prototype.CreateControlHierarchyInternal.call(this);
13753   this.CreateImageAreaElement();
13754   this.CreateSlideShowButton();
13755  },
13756  CreateImageAreaElement: function () {
13757   this.imageAreaElement = document.createElement("DIV");
13758   this.GetImageSlider().GetPassePartoutElement().appendChild(this.imageAreaElement);
13759  },
13760  CreateSlideShowButton: function () {
13761   if(this.GetImageSlider().playPauseBtnVbl != ElementVisibilityModeEnum.None)
13762    this.slideShowButton = new SlideShowButton(this);
13763  },
13764  CreateOverlayElements: function () {
13765   var itemsContainer = this.GetItemsContainer();
13766   if(!itemsContainer)
13767    return;
13768   if(this.GetImageSlider().HasNavigateUrls()) {
13769    this.overlayLinkElement = document.createElement("A");
13770    itemsContainer.insertBefore(this.overlayLinkElement, itemsContainer.firstChild);
13771    this.overlayLinkElement.className = CssClassesConstants.OverlayElementCssClass;
13772    this.overlayLinkElement.target = this.GetTarget();
13773   }
13774   this.overlayImageElement = document.createElement("IMG");
13775   this.overlayImageElement.src = ASPx.EmptyImageUrl;
13776   this.overlayImageElement.alt = "";
13777   if(this.overlayLinkElement)
13778    this.overlayLinkElement.appendChild(this.overlayImageElement);
13779   else {
13780    this.overlayImageElement.className = CssClassesConstants.OverlayElementCssClass;
13781    itemsContainer.insertBefore(this.overlayImageElement, itemsContainer.firstChild);
13782   }
13783  },
13784  UpdateOverlayParameters: function () {
13785   var activeItemIndex = this.GetActiveItemIndex();
13786   var currentItem = this.GetItem(activeItemIndex);
13787   if(this.overlayLinkElement) {
13788    if(!currentItem.u)
13789     this.overlayLinkElement.removeAttribute("href");
13790    else if(this.overlayLinkElement.href != currentItem.u)
13791     this.overlayLinkElement.href = currentItem.u;
13792   }
13793   if(this.overlayImageElement) {
13794    if(currentItem.s)
13795     this.overlayImageElement.src = currentItem.s;
13796    if(currentItem.tpl)
13797     this.overlayImageElement.style.display = "none";
13798    else {
13799     this.overlayImageElement.style.display = "";
13800     this.overlayImageElement.alt = this.IsAccessibilityCompliant() ? this.GetItemAlternateText(activeItemIndex) : "";
13801    }
13802   }
13803  },
13804  PrepareControlHierarchy: function () {
13805   ItemsOwnerBase.prototype.PrepareControlHierarchy.call(this);
13806   this.UpdateOverlayParameters();
13807   var imageAreaElement = this.GetImageAreaElement();
13808   ASPx.SetStyles(imageAreaElement, {
13809    className: this.GetImageSlider().imgAreaCssCl,
13810    cssText: this.GetImageSlider().imgAreaStyle
13811   });
13812   this.imageAreaStyleSize = {
13813    width: imageAreaElement.style.width,
13814    height: imageAreaElement.style.height
13815   };
13816   this.GetItemsContainer().style.zIndex = "0";
13817  },
13818  AdjustControl: function (width, height) {
13819   this.AdjustImageAreaElement(width, height);
13820   ItemsOwnerBase.prototype.AdjustControl.call(this);
13821  },
13822  AdjustImageAreaElement: function (width, height) {
13823   var imageAreaElement = this.GetImageAreaElement();
13824   if(!imageAreaElement.style.width) {
13825    ASPx.SetStyles(imageAreaElement, { width: width });
13826    if(imageAreaElement.offsetWidth > width)
13827     ASPx.SetStyles(imageAreaElement, { width: width - (imageAreaElement.offsetWidth - width) });
13828   }
13829   if(!imageAreaElement.style.height) {
13830    ASPx.SetStyles(imageAreaElement, { height: height });
13831    if(imageAreaElement.offsetHeight > height)
13832     ASPx.SetStyles(imageAreaElement, { height: height - (imageAreaElement.offsetHeight - height) });
13833   }
13834   if(imageAreaElement.offsetHeight < height)
13835    ASPx.SetStyles(imageAreaElement, { top: (height - imageAreaElement.offsetHeight) / 2 });
13836  },
13837  ResetControlStyle: function () {
13838   var imageAreaElement = this.GetImageAreaElement();
13839   ASPx.SetStyles(imageAreaElement, this.imageAreaStyleSize);
13840   ASPx.SetStyles(imageAreaElement, { top: 0 });
13841  },
13842  IsNeedCreateHyperLink: function () {
13843   return false;
13844  },
13845  SetActiveItemIndexInternal: function (index, preventAnimation) {
13846   ItemsOwnerBase.prototype.SetActiveItemIndexInternal.call(this, index, preventAnimation);
13847   this.UpdateOverlayParameters();
13848  },
13849  CalculateItemElementSize: function (fakeElement) {
13850   var imageArea = this.GetImageAreaElement();
13851   imageArea.appendChild(fakeElement);
13852   this.fullItemWidth = SizeUtils.GetClientWidth(imageArea, true);
13853   this.fullItemHeight = SizeUtils.GetClientHeight(imageArea, true);
13854   ASPx.SetStyles(fakeElement, {
13855    width: this.fullItemWidth,
13856    height: this.fullItemHeight
13857   });
13858   this.clearItemWidth = this.fullItemWidth - (SizeUtils.GetClientWidth(fakeElement) - this.fullItemWidth);
13859   this.clearItemHeight = this.fullItemHeight - (SizeUtils.GetClientHeight(fakeElement) - this.fullItemHeight);
13860  },
13861  CreateItemElement: function (index) {
13862   var itemElement = ItemsOwnerBase.prototype.CreateItemElement.call(this, index);
13863   var textElement = this.CreateItemTextElement(index);
13864   if(!textElement)
13865    return itemElement;
13866   itemElement.appendChild(textElement);
13867   return itemElement;
13868  },
13869  CreateItemTextElement: function (index) {
13870   var text = this.GetItemText(index);
13871   var textTemplate = this.GetTextTemplate(index);
13872   if(this.GetItemTextVisibilityMode() == ElementVisibilityModeEnum.None || (!text && !textTemplate))
13873    return null;
13874   var itemTextElement = this.CreateDiv();
13875   if(!textTemplate)
13876    itemTextElement.innerHTML = text;
13877   ASPx.SetStyles(itemTextElement, { className: this.GetImageSlider().itemTxtCssCl });
13878   return itemTextElement;
13879  },
13880  PrepareItemTextElement: function (index) {
13881   var itemTextElement = this.GetItemTextElement(index);
13882   if(itemTextElement) {
13883    var style = { cssText: this.GetImageSlider().itemTxtStyle, zIndex: 2, className: itemTextElement.className + " dx-wbv" };
13884    if(this.GetItemTextVisibilityMode() != ElementVisibilityModeEnum.Always)
13885     style.opacity = this.currentItemTextElementOpacity;
13886    ASPx.SetStyles(itemTextElement, style);
13887   }
13888  },
13889  PrepareItemElement: function (index) {
13890   ItemsOwnerBase.prototype.PrepareItemElement.call(this, index);
13891   this.PrepareItemTextElement(index);
13892  },
13893  GetItemElementCssClass: function () {
13894   return this.GetImageSlider().itemCssCl;
13895  },
13896  GetItemElementStyle: function () {
13897   return this.GetImageSlider().itemStyle;
13898  },
13899  PrepareCanvasElement: function (index) {
13900   var canvas = this.GetCanvasElement(index);
13901   canvas.style.position = "absolute";
13902   canvas.style.zIndex = "0";
13903  },
13904  GetItemTextElement: function (index) {
13905   var itemElement = this.GetItemElement(index);
13906   return itemElement ? ASPx.GetChildByClassName(itemElement, CssClasse
13906sConstants.TextAreaCssClassName) : null;
13907  },
13908  GetImageAreaElement: function () {
13909   return this.imageAreaElement;
13910  },
13911  GetItemTextVisibilityMode: function () {
13912   return this.GetImageSlider().itemTxtVbl;
13913  },
13914  GetNavigationBarStrategy: function () {
13915   return this.GetImageSlider().GetNavigationBarStrategy();
13916  },
13917  HasMouseOverForTouchDevice: function () {
13918   if(!ASPx.Browser.TouchUI)
13919    return false;
13920   return this.HasMouseOverImageAreaNavigationButtons() || this.HasMouseOverNavigationBarNavigationButtons() || this.HasMouseOverTextArea() || this.HasMouseOverSlideShowButton();
13921  },
13922  HasMouseOverImageAreaNavigationButtons: function () {
13923   return this.IsMouseOverOrFaded(this.GetNavigationBtnsVisibilityMode());
13924  },
13925  HasMouseOverNavigationBarNavigationButtons: function () {
13926   var navigationBar = this.GetNavigationBarStrategy();
13927   if(!navigationBar)
13928    return false;
13929   return this.IsMouseOverOrFaded(navigationBar.GetNavigationBtnsVisibilityMode());
13930  },
13931  HasMouseOverTextArea: function () {
13932   return this.IsMouseOverOrFaded(this.GetItemTextVisibilityMode());
13933  },
13934  HasMouseOverSlideShowButton: function () {
13935   return this.IsMouseOverOrFaded(this.GetImageSlider().playPauseBtnVbl);
13936  },
13937  IsMouseOverOrFaded: function (visibility) {
13938   return visibility == ElementVisibilityModeEnum.Faded || visibility == ElementVisibilityModeEnum.OnMouseOver;
13939  },
13940  InitializeHandlers: function () {
13941   ItemsOwnerBase.prototype.InitializeHandlers.call(this);
13942   var imageSlider = this.GetImageSlider();
13943   imageSlider.StrategiesCreated.AddHandler(function () {
13944    if(this.CanHandleClickEvent())
13945     ASPx.Evt.AttachEventToElement(this.GetImageAreaElement(), ASPx.Browser.TouchUI ? ASPx.TouchUIHelper.touchMouseUpEventName : "click", function (evt) { this.OnImageAreaClick(evt); }.aspxBind(this));
13946   }.aspxBind(this));
13947   if(!ASPx.Browser.TouchUI && this.IsMouseOverOrFaded(this.GetItemTextVisibilityMode()))
13948    MouseEnterHelper.AddHandler(
13949     imageSlider.GetPassePartoutElement(),
13950     function () { this.AppearTextElements(); }.aspxBind(this),
13951     function () { this.DisappearTextElements(); }.aspxBind(this)
13952    );
13953  },
13954  CanHandleClickEvent: function () {
13955   var imageSlider = this.GetImageSlider();
13956   return !imageSlider.ItemClick.IsEmpty() || imageSlider.HasNavigateUrls() || this.HasMouseOverForTouchDevice();
13957  },
13958  OnImageAreaClick: function (evt) {
13959   this.GetImageSlider().RaiseItemClick();
13960   if(!this.HasMouseOverForTouchDevice())
13961    return;
13962   if(this.touchDeviceElementsVisible) {
13963    if(this.HasMouseOverTextArea())
13964     this.DisappearTextElements();
13965    if(this.HasMouseOverImageAreaNavigationButtons())
13966     this.navigationButtons.Disappear();
13967    if(this.HasMouseOverNavigationBarNavigationButtons())
13968     this.GetNavigationBarStrategy().navigationButtons.Disappear();
13969    if(this.HasMouseOverSlideShowButton())
13970     this.slideShowButton.Disappear();
13971   }
13972   else {
13973    if(this.HasMouseOverTextArea())
13974     this.AppearTextElements();
13975    if(this.HasMouseOverImageAreaNavigationButtons())
13976     this.navigationButtons.Appear();
13977    if(this.HasMouseOverNavigationBarNavigationButtons())
13978     this.GetNavigationBarStrategy().navigationButtons.Appear();
13979    if(this.HasMouseOverSlideShowButton())
13980     this.slideShowButton.Appear();
13981   }
13982   this.touchDeviceElementsVisible = !this.touchDeviceElementsVisible;
13983  },
13984  AppearTextElements: function () {
13985   this.FadeItemTextElements(1);
13986  },
13987  DisappearTextElements: function () {
13988   this.FadeItemTextElements(this.defaultItemTextElementOpacity);
13989  },
13990  FadeItemTextElements: function (value) {
13991   this.currentItemTextElementOpacity = value;
13992   var activeItemIndex = this.GetActiveItemIndex();
13993   this.ForEachItem(function (i) {
13994    var preventAnimation = true;
13995    if(i == activeItemIndex && this.GetAnimationType() != AnimationTypeEnum.None)
13996     preventAnimation = false;
13997    this.FadeItemTextElement(i, preventAnimation);
13998   });
13999  },
14000  FadeItemTextElement: function (index, preventAnimation) {
14001   var textElement = this.GetItemTextElement(index);
14002   if(!textElement) 
14003    return;
14004   if(preventAnimation)
14005    ASPx.SetStyles(textElement, { opacity: this.currentItemTextElementOpacity })
14006   else
14007    ASPx.AnimationHelper.fadeTo(textElement, { to: this.currentItemTextElementOpacity });
14008  },
14009  GetWidth: function () {
14010   return SizeUtils.GetClientWidth(this.GetImageAreaElement());
14011  },
14012  GetHeight: function () {
14013   return SizeUtils.GetClientHeight(this.GetImageAreaElement());
14014  }
14015 });
14016 var SlideImageAreaStrategy = ASPx.CreateClass(ImageAreaStrategy, {
14017  constructor: function (imageSlider) {
14018   this.constructor.prototype.constructor.call(this, imageSlider);
14019  },
14020  SetActiveItemIndexInternal: function (index, preventAnimation) {
14021   ImageAreaStrategy.prototype.SetActiveItemIndexInternal.call(this, index, preventAnimation);
14022   this.UpdateItemElementsAfterDelayIfRequired();
14023   var position = this.GetItemElementPosition(index);
14024   if(preventAnimation) {
14025    this.SetElementTransformPosition(this.GetSlidePanelElement(), position);
14026    this.UpdateItemElementsIfRequired();
14027   }
14028   else
14029    ASPx.AnimationHelper.slideTo(this.GetSlidePanelElement(), {
14030     to: position, duration: this.GetImageSlider().animationDuration,
14031     direction: this.IsHorizontalNavigation() ? ASPx.AnimationHelper.SLIDE_HORIZONTAL_DIRECTION : ASPx.AnimationHelper.SLIDE_VERTICAL_DIRECTION,
14032     onComplete: function () { this.UpdateItemElementsIfRequired(); }.aspxBind(this)
14033    });
14034  },
14035  PerformRollBack: function () {
14036   this.SetActiveItemIndexInternal(this.GetActiveItemIndex(), false);
14037  },
14038  CreateControlHierarchyInternal: function () {
14039   ImageAreaStrategy.prototype.CreateControlHierarchyInternal.call(this);
14040   this.slidePanelElement = this.CreateDiv();
14041   this.GetImageAreaElement().appendChild(this.slidePanelElement);
14042  },
14043  PrepareControlHierarchy: function () {
14044   ImageAreaStrategy.prototype.PrepareControlHierarchy.call(this);
14045   var slideElement = this.GetSlidePanelElement();
14046   slideElement.className = CssClassesConstants.ImageAreaSlidePanelCssClassName;
14047   this.PatchElementForMSTouch(slideElement);
14048  },
14049  AdjustControlInternal: function () {
14050   ImageAreaStrategy.prototype.AdjustControlInternal.call(this);
14051   var horizontal = this.IsHorizontalNavigation();
14052   var width = horizontal ? this.GetItemCount() * this.GetItemElementWidth() : this.GetItemElementWidth();
14053   var height = !horizontal ? this.GetItemCount() * this.GetItemElementHeight() : this.GetItemElementHeight();
14054   ASPx.SetStyles(this.GetSlidePanelElement(), {
14055    width: width,
14056    height: height
14057   });
14058  },
14059  AdjustItemElement: function (index) {
14060   ImageAreaStrategy.prototype.AdjustItemElement.call(this, index);
14061   var itemElement = this.GetItemElement(index);
14062   var position = this.IsHorizontalNavigation() ? this.GetItemElementWidth() * index : this.GetItemElementHeight() * index;
14063   if(this.IsHorizontalNavigation())
14064    ASPx.SetStyles(itemElement, { left: position });
14065   else
14066    ASPx.SetStyles(itemElement, { top: position });
14067  },
14068  GetItemsContainer: function () {
14069   return this.GetSlidePanelElement();
14070  },
14071  CanCreateSwipeGestureHandler: function () {
14072   return true;
14073  },
14074  IsEnablePagingByClick: function () {
14075   var imageSlider = this.GetImageSlider();
14076   return imageSlider.ItemClick.IsEmpty() && !imageSlider.HasNavigateUrls() && ImageAreaStrategy.prototype.IsEnablePagingByClick.call(this);
14077  },
14078  OnImageAreaClick: function (evt) {
14079   if(this.IsExecutedGesture())
14080    return ASPx.Evt.PreventEventAndBubble(evt);
14081   else
14082    ImageAreaStrategy.prototype.OnImageAreaClick.call(this, evt);
14083  },
14084  GetItemElementPosition: function (index) {
14085   return this.IsHorizontalNavigation() ? -(index * this.GetItemElementWidth()) : -(index * this.GetItemElementHeight());
14086  }
14087 });
14088 var SlideLoopNavigationImageAreaStrategy = ASPx.CreateClass(SlideImageAreaStrategy, {
14089  constructor: function (imageSlider) {
14090   this.simpleTransition = null;
14091   this.constructor.prototype.constructor.call(this, imageSlider);
14092  },
14093  CreateItemElementsManager: function () {
14094   return new LoopImageAreaItemElementsManager(this);
14095  },
14096  GetEnableLoopNavigation: function () {
14097   return true;
14098  },
14099  StartSlideSimpleTransition: function (from, to, preventAnimation) {
14100   this.UpdateItemsPosition(to - from, preventAnimation);
14101   if(!preventAnimation) {
14102    this.simpleTransition = ASPx.AnimationHelper.createSimpleAnimationTransition({
14103     duration: this.GetImageSlider().animationDuration,
14104     onUpdate: function (value) {
14105      this.UpdateItemsPosition(value, true);
14106     }.aspxBind(this)
14107    });
14108    this.simpleTransition.Start(from, to);
14109   }
14110  },
14111  StopSimpleTransition: function () {
14112   if(this.simpleTransition) {
14113    this.simpleTransition.Cancel();
14114    this.simpleTransition = null;
14115   }
14116  },
14117  UpdateItemsPosition: function (value, needApplyPositions) {
14118   this.ForEachItem(function (i) {
14119    var element = this.GetItemElement(i);
14120    if(element) {
14121     element.dxPosition = element.dxPosition + value;
14122     if(needApplyPositions)
14123      this.SetItemPosition(element);
14124    }
14125   });
14126  },
14127  OnMouseMoveUpdatePosition: function (position) {
14128   this.StopSimpleTransition();
14129   var itemSize = this.GetItemElementSize();
14130   this.ForEachItem(function (i) {
14131    var element = this.GetItemElement(i);
14132    if(element)
14133     element.dxPosition = element.dxPosition + position;
14134   });
14135   this.ForEachItem(function (i) {
14136    var element = this.GetItemElement(i);
14137    if(!element)
14138     return;
14139    this.SetItemPosition(element);
14140    if(element.dxPosition < 0 && ((element.dxPosition + itemSize) > 0)) {
14141     var index = i + 1;
14142     if(index == this.GetItemCount())
14143      index = 0;
14144     var nextItem = this.GetItemElement(index);
14145     nextItem.dxPosition = element.dxPosition + itemSize;
14146     this.SetItemPosition(nextItem);
14147    }
14148    if(element.dxPosition < itemSize && ((element.dxPosition + itemSize) > itemSize)) {
14149     var index = i - 1;
14150     if(index < 0)
14151      index = this.GetItemCount() - 1;
14152     var nextItem = this.GetItemElement(index);
14153     nextItem.dxPosition = element.dxPosition - itemSize;
14154     this.SetItemPosition(nextItem);
14155    }
14156   });
14157  },
14158  SetItemPosition: function (itemElement) {
14159   this.SetElementTransformPosition(itemElement, itemElement.dxPosition);
14160  },
14161  SetActiveItemIndexInternal: function (index, preventAnimation, isRollback) {
14162   ImageAreaStrategy.prototype.SetActiveItemIndexInternal.call(this, index, preventAnimation);
14163   this.StopSimpleTransition();
14164   this.UpdateItemElementsIfRequired();
14165   var currentIndex = this.GetPrevItemIndex();
14166   if(currentIndex == -1 || this.IsRtl() && currentIndex == this.GetItemCount())
14167    currentIndex = index;
14168   if(!isRollback) {
14169    var isLeft = currentIndex > index;
14170    if(currentIndex == 0 && index == this.GetItemCount() - 1)
14171     isLeft = true;
14172    if(currentIndex == this.GetItemCount() - 1 && index == 0)
14173     isLeft = false;
14174    var prevItem = this.GetItemElement(currentIndex);
14175    var nextIndex = isLeft ? currentIndex - 1 : currentIndex + 1;
14176    for(var i = 1; i < this.GetItemCount() ; i++) {
14177     if(isLeft && nextIndex < 0)
14178      nextIndex = this.GetItemCount() - 1;
14179     else if(nextIndex == this.GetItemCount())
14180      nextIndex = 0;
14181     var nextItem = this.GetItemElement(nextIndex);
14182     if(nextItem) {
14183      nextItem.dxPosition = (isLeft ? -1 : 1) * (this.GetItemElementSize() * i) + prevItem.dxPosition;
14184      this.SetItemPosition(nextItem);
14185     }
14186     nextIndex = isLeft ? nextIndex - 1 : nextIndex + 1;
14187    }
14188   }
14189   var offset = this.GetItemElement(index).dxPosition;
14190   this.StartSlideSimpleTransition(offset, 0, preventAnimation);
14191  },
14192  PerformRollBack: function () {
14193   this.SetActiveItemIndexInternal(this.GetActiveItemIndex(), false, true);
14194  },
14195  CreateControlHierarchyInternal: function () {
14196   ImageAreaStrategy.prototype.CreateControlHierarchyInternal.call(this);
14197  },
14198  PrepareControlHierarchy: function () {
14199   ImageAreaStrategy.prototype.PrepareControlHierarchy.call(this);
14200   this.PatchElementForMSTouch(this.GetImageAreaElement());
14201  },
14202  AdjustControlInternal: function () {
14203   ImageAreaStrategy.prototype.AdjustControlInternal.call(this);
14204  },
14205  AdjustItemElement: function (index) {
14206   ImageAreaStrategy.prototype.AdjustItemElement.call(this, index);
14207   var itemElement = this.GetItemElement(index);
14208   itemElement.dxPosition = this.IsHorizontalNavigation() ? this.GetItemElementWidth() * index : this.GetItemElementHeight() * index;;
14209   this.SetItemPosition(itemElement);
14210  },
14211  CreateSwipeGestureHandler: function () {
14212   ASPx.GesturesHelper.AddSwipeSlideGestureHandler(
14213    this.GetClientControlName() + this.GetUniqueId(),
14214    function () { return this.GetSwipeGestureElement(); }.aspxBind(this),
14215    this.IsHorizontalNavigation() ? ASPx.AnimationHelper.SLIDE_HORIZONTAL_DIRECTION : ASPx.AnimationHelper.SLIDE_VERTICAL_DIRECTION,
14216    function (evt) { return this.CanHandleSwipeGesture(evt); }.aspxBind(this),
14217    function () { this.PerformBackward(); }.aspxBind(this),
14218    function () { this.PerformForward(); }.aspxBind(this),
14219    function () { this.PerformRollBack(); }.aspxBind(this),
14220    function (position) { this.OnMouseMoveUpdatePosition(position); }.aspxBind(this)
14221   );
14222  },
14223  UpdateOverlayParameters: function () {
14224   SlideImageAreaStrategy.prototype.UpdateOverlayParameters.call(this);
14225   if(this.overlayImageElement) {
14226    var textElement = this.GetItemTextElement(this.GetActiveItemIndex());
14227    if(textElement)
14228     this.overlayImageElement.style.height = (this.GetImageAreaElement().offsetHeight - textElement.offsetHeight) + "px";
14229   }
14230  },
14231  GetSwipeGestureElement: function () {
14232   return this.GetImageAreaElement();
14233  },
14234  GetItemsContainer: function () {
14235   return this.GetImageAreaElement();
14236  },
14237  UpdateNavigationButtonsState: function () {
14238   return false;
14239  }
14240 });
14241 FadeImageAreaStrategy = ASPx.CreateClass(ImageAreaStrategy, {
14242  constructor: function (imageSlider) {
14243   this.constructor.prototype.constructor.call(this, imageSlider);
14244  },
14245  SetActiveItemIndexInternal: function (index, preventAnimation) {
14246   ImageAreaStrategy.prototype.SetActiveItemIndexInternal.call(this, index, preventAnimation);
14247   this.UpdateItemElementsIfRequired();
14248   var appearItem = this.GetItemElement(index);
14249   var disapperItem = this.GetItemElement(this.GetPrevItemIndex());
14250   if(preventAnimation) {
14251    this.SetVisible(appearItem);
14252    if(disapperItem)
14253     this.SetInvisible(disapperItem);
14254   }
14255   else {
14256    var duration = this.GetImageSlider().animationDuration;
14257    ASPx.SetElementDisplay(appearItem, true);
14258    ASPx.AnimationHelper.fadeTo(disapperItem, {
14259     to: 0, duration: duration,
14260     onComplete: function (el) { ASPx.SetElementDisplay(el, false); }
14261    });
14262    ASPx.AnimationHelper.fadeTo(appearItem, {
14263     to: 1, duration: duration
14264    });
14265   }
14266  },
14267  UpdateNavigationButtonsState: function () {
14268   if(!this.GetEnableLoopNavigation())
14269    return ImageAreaStrategy.prototype.UpdateNavigationButtonsState.call(this);
14270   return false;
14271  },
14272  AdjustItemElement: function (index) {
14273   ImageAreaStrategy.prototype.AdjustItemElement.call(this, index);
14274   this.SetInvisible(this.GetItemElement(index));
14275  },
14276  GetEnableLoopNavigation: function () {
14277   return this.GetImageSlider().enableLoopNavigation;
14278  },
14279  CanCreateSwipeGestureHandler: function () {
14280   return true;
14281  },
14282  GetSwipeGestureElement: function () {
14283   return this.GetImageAreaElement();
14284  },
14285  OnImageAreaClick: function (evt) {
14286   if(this.IsExecutedGesture())
14287    return ASPx.Evt.PreventEventAndBubble(evt);
14288   else
14289    ImageAreaStrategy.prototype.OnImageAreaClick.call(this, evt);
14290  },
14291  CreateSwipeGestureHandler: function () {
14292   ASPx.GesturesHelper.AddSwipeSlideGestureHandler(
14293    this.GetClientControlName() + this.GetUniqueId(),
14294    function () { return this.GetSwipeGestureElement(); }.aspxBind(this),
14295    this.IsHorizontalNavigation() ? ASPx.AnimationHelper.SLIDE_HORIZONTAL_DIRECTION : ASPx.AnimationHelper.SLIDE_VERTICAL_DIRECTION,
14296    function (evt) { return this.CanHandleSwipeGesture(evt); }.aspxBind(this),
14297    function () { this.PerformBackward(); }.aspxBind(this),
14298    function () { this.PerformForward(); }.aspxBind(this),
14299    function () { },
14300    function () { }
14301   );
14302  },
14303  GetItemsContainer: function () {
14304   return this.GetImageAreaElement();
14305  },
14306  SetVisible: function (element) {
14307   ASPx.SetStyles(element, {
14308    display: "",
14309    opacity: 1
14310   });
14311  },
14312  SetInvisible: function (element) {
14313   ASPx.SetStyles(element, {
14314    display: "none",
14315    opacity: 0
14316   });
14317  }
14318 });
14319 var NoneImageAreaStrategy = ASPx.CreateClass(FadeImageAreaStrategy, {
14320  constructor: function (imageSlider) {
14321   this.constructor.prototype.constructor.call(this, imageSlider);
14322  },
14323  SetActiveItemIndexInternal: function (index, preventAnimation) {
14324   FadeImageAreaStrategy.prototype.SetActiveItemIndexInternal.call(this, index, true);
14325  }
14326 });
14327 var NavigationBarStrategy = ASPx.CreateClass(ItemsOwnerBase, {
14328  constructor: function (imageSlider) {
14329   this.navigationBarElement = null;
14330   this.slidePanelWrapperElement = null;
14331   this.lastSlideItemsPortionDate = new Date();
14332   this.slideElementPosition = 0;
14333   this.constructor.prototype.constructor.call(this, imageSlider);
14334  },
14335  GetUniqueId: function () {
14336   return "_nb_";
14337  },
14338  IsHorizontalNavigation: function () {
14339   var position = this.GetPositionMode();
14340   return position == NavigationBarPositionEnum.Top || position == NavigationBarPositionEnum.Bottom;
14341  },
14342  IsNeedCreateHyperLink: function () {
14343   return false;
14344  },
14345  GetLoadingElement: function (index) {
14346   return null;
14347  },
14348  CreateItemElementsManager: function () {
14349   return new NavigationBarItemElementsManager(this);
14350  },
14351  GetTemplate: function (index) {
14352   return this.GetItem(index).tmtpl;
14353  },
14354  GetImageSrc: function (index) {
14355   var thumbnailImageSrc = this.GetItem(index).ts;
14356   if(thumbnailImageSrc)
14357    return thumbnailImageSrc;
14358   return this.GetItem(index).s;
14359  },
14360  SetActiveItemIndexInternal: function (index, preventAnimation) {
14361   var snapToLeft = this.IsSnapToLeft(index);
14362   var nextIndex = snapToLeft ? index - 1 : index + 1;
14363   if(this.GetImageSlider().extremeItemClickMode == ExtremeItemClickModeEnum.Select || !this.IsValidItemIndex(nextIndex))
14364    nextIndex = index;
14365   if(!this.IsVisibleItemElement(nextIndex, true))
14366    this.SlideToItem(nextIndex, snapToLeft, preventAnimation);
14367   this.SetActiveItemVisually(index, preventAnimation);
14368  },
14369  IsVisibleItemElement: function (index, considerSize) {
14370   var slideWrapperElementSize = this.GetElementSize(this.GetSlidePanelWrapperElement());
14371   var itemPosition = (this.GetItemElementSize() + this.GetItemSpacing()) * index;
14372   var itemPositionInSlideWrapper = this.ConvertItemPositionToSlideWrapperPosition(itemPosition);
14373   if(considerSize)
14374    return itemPositionInSlideWrapper >= 0 && itemPositionInSlideWrapper + this.GetItemElementSize() <= slideWrapperElementSize;
14375   return itemPositionInSlideWrapper + this.GetItemElementSize() >= 0 && itemPositionInSlideWrapper <= slideWrapperElementSize;
14376  },
14377  IsSnapToLeft: function (index) {
14378   var slideWrapperElementSize = this.GetElementSize(this.GetSlidePanelWrapperElement());
14379   var itemPosition = (this.GetItemElementSize() + this.GetItemSpacing()) * index;
14380   var lastItemSize = this.GetItemElementSize() + (index != this.GetItemCount() - 1 ? this.GetItemSpacing() : 0);
14381   return this.ConvertItemPositionToSlideWrapperPosition(itemPosition + lastItemSize) < (slideWrapperElementSize / 2);
14382  },
14383  ConvertItemPositionToSlideWrapperPosition: function (itemPosition) {
14384   return this.GetElementTransformPosition(this.GetSlidePanelElement()) + itemPosition;
14385  },
14386  SlideToItem: function (index, snapToLeft, preventAnimation) {
14387   this.UpdateItemElementsAfterDelayIfRequired();
14388   this.CalculateSlideElementPosition(index, snapToLeft);
14389   this.PerformSlideAction(preventAnimation);
14390  },
14391  CalculateSlideElementPosition: function (index, snapToLeft) {
14392   var slideWrapperElementSize = this.GetElementSize(this.GetSlidePanelWrapperElement());
14393   var itemPosition = (this.GetItemElementSize() + this.GetItemSpacing()) * index;
14394   if(snapToLeft) {
14395    this.slideElementPosition = -itemPosition;
14396    var limitPosition = -(this.GetElementSize(this.GetSlidePanelElement()) - this.GetElementSize(this.GetSlidePanelWrapperElement()));
14397    var next = this.GetElementTransformPosition(this.GetSlidePanelElement()) > this.slideElementPosition;
14398    if(this.slideElementPosition < limitPosition || next && Math.abs(-limitPosition + this.slideElementPosition) < this.GetItemElementSize())
14399     this.slideElementPosition = limitPosition;
14400   }
14401   else {
14402    this.slideElementPosition = slideWrapperElementSize - (itemPosition + this.GetItemElementSize());
14403    var prev = this.GetElementTransformPosition(this.GetSlidePanelElement()) < this.slideElementPosition;
14404    if(this.slideElementPosition > 0 || prev && this.slideElementPosition > -this.GetItemElementSize())
14405     this.slideElementPosition = 0;
14406   }
14407  },
14408  PerformSlideAction: function (preventAnimation) {
14409   this.UpdateNavigationButtonsState(); 
14410   if(preventAnimation)
14411    this.SetElementTransformPosition(this.GetSlidePanelElement(), this.slideElementPosition);
14412   else {
14413    ASPx.AnimationHelper.slideTo(this.GetSlidePanelElement(), {
14414     to: this.slideElementPosition, callBack: function () { this.UpdateItemElementsIfRequired(); }.aspxBind(this),
14415     duration: this.IsSinglePagingMode() ? 300 : ASPx.AnimationConstants.Durations.Default,
14416     direction: this.IsHorizontalNavigation() ? ASPx.AnimationHelper.SLIDE_HORIZONTAL_DIRECTION : ASPx.AnimationHelper.SLIDE_VERTICAL_DIRECTION
14417    });
14418   }
14419  },
14420  SetActiveItemVisually: function (index, preventAnimation) {
14421  },
14422  GetNavigationBtnsVisibilityMode: function () {
14423   return this.GetImageSlider().thumbNavBtnsVbl;
14424  },
14425  GetButtonsContainer: function () {
14426   return this.GetNavigationBarElement();
14427  },
14428  GetPrevButtonHtml: function () {
14429   return this.GetImageSlider().nbpbh;
14430  },
14431  GetNextButtonHtml: function () {
14432   return this.GetImageSlider().nbnbh;
14433  },
14434  UpdateNavigationButtonsState: function () {
14435   if(this.navigationButtons) {
14436    var oldButtonsVisibility = this.navigationButtons.GetVisibilityButtons();
14437    if(this.IsWrapperOverlapsItemCollection())
14438     this.SetVisibilityButtons(false);
14439    else {
14440     this.SetVisibilityButtons(true);
14441     var minOffset = -(this.GetElementSize(this.GetSlidePanelElement(), false) - this.GetElementSize(this.GetSlidePanelWrapperElement(), true)), maxOffset = 0;
14442     this.SetEnablePrevButton(this.slideElementPosition != maxOffset);
14443     this.SetEnableNextButton(this.slideElementPosition != minOffset);
14444    }
14445    return oldButtonsVisibility != this.navigationButtons.GetVisibilityButtons();
14446   }
14447   return false;
14448  },
14449  PerformBackward: function () {
14450   if(this.IsSinglePagingMode())
14451    this.SlideItemsPortionSingleMode(true);
14452   else
14453    this.SlideItemsPortionPageMode(true);
14454  },
14455  PerformForward: function () {
14456   if(this.IsSinglePagingMode())
14457    this.SlideItemsPortionSingleMode(false);
14458   else
14459    this.SlideItemsPortionPageMode(false);
14460  },
14461  PerformRollBack: function () {
14462   var position = this.GetElementTransformPosition(this.GetSlidePanelElement());
14463   var slidePanelElementSize = this.GetElementSize(this.GetSlidePanelElement());
14464   var slidePanelWrapperElementSize = this.GetElementSize(this.GetSlidePanelWrapperElement());
14465   var minPosition = slidePanelWrapperElementSize - slidePanelElementSize;
14466   if(this.IsWrapperOverlapsItemCollection())
14467    this.slideElementPosition = (slidePanelWrapperElementSize - slidePanelElementSize) / 2;
14468   else if(position > 0)
14469    this.slideElementPosition = 0;
14470   else if(position < minPosition)
14471    this.slideElementPosition = minPosition;
14472   this.PerformSlideAction();
14473  },
14474  SlideItemsPortionPageMode: function (backward) {
14475   var index = backward ? 0 : this.GetItemCount() - 1;
14476   var lastIndex = backward ? this.GetItemCount() - 1 : 0;
14477   var previousInvisibleIndex = index;
14478   while(index != lastIndex) {
14479    if(this.IsVisibleItemElement(index, true)) {
14480     this.SlideToItem(previousInvisibleIndex, !backward);
14481     break;
14482    }
14483    previousInvisibleIndex = index;
14484    index += backward ? 1 : -1;
14485   }
14486  },
14487  SlideItemsPortionSingleMode: function (backward) {
14488   var index = backward ? 0 : this.GetItemCount() - 1;
14489   var lastIndex = backward ? this.GetItemCount() - 1 : 0;
14490   var previousInvisibleIndex = index;
14491   var considerSize = new Date() - this.lastSlideItemsPortionDate < 350 ? false : true;
14492   while(index != lastIndex) {
14493    if(this.IsVisibleItemElement(index, considerSize)) {
14494     this.SlideToItem(previousInvisibleIndex, backward);
14495     break;
14496    }
14497    previousInvisibleIndex = index;
14498    index += backward ? 1 : -1;
14499   }
14500   this.lastSlideItemsPortionDate = new Date();
14501  },
14502  CreateControlHierarchyInternal: function () {
14503   ItemsOwnerBase.prototype.CreateControlHierarchyInternal.call(this);
14504   var mainElement = this.GetMainElement();
14505   this.navigationBarElement = this.CreateDiv();
14506   this.slidePanelWrapperElement = this.CreateDiv();
14507   switch (this.GetPositionMode()) {
14508    case NavigationBarPositionEnum.Top:
14509    case NavigationBarPositionEnum.Left:
14510     var passePartour = this.GetImageSlider().GetPassePartoutElement();
14511     if(passePartour) {
14512      mainElement.insertBefore(this.navigationBarElement, passePartour);
14513      break;
14514     }
14515    case NavigationBarPositionEnum.Bottom:
14516    case NavigationBarPositionEnum.Right:
14517     mainElement.appendChild(this.navigationBarElement);
14518     break;
14519   }
14520   this.slidePanelElement = this.CreateDiv();
14521   this.slidePanelWrapperElement.appendChild(this.slidePanelElement);
14522   this.navigationBarElement.appendChild(this.slidePanelWrapperElement);
14523  },
14524  GetItemsContainer: function () {
14525   return this.GetSlidePanelElement();
14526  },
14527  PrepareControlHierarchy: function () {
14528   ItemsOwnerBase.prototype.PrepareControlHierarchy.call(this);
14529   this.PrepareNavigationBarElement();
14530   this.PrepareSlidePanelElement();
14531  },
14532  PrepareNavigationBarElement: function () {
14533   var navigationBarElement = this.GetNavigationBarElement();
14534   ASPx.SetStyles(navigationBarElement, {
14535    className: this.GetImageSlider().navBarCssCl,
14536    cssText: this.GetImageSlider().navBarStyle
14537   });
14538  },
14539  PrepareSlidePanelElement: function () {
14540   var slideElement = this.GetSlidePanelElement();
14541   slideElement.className = CssClassesConstants.NavigationBarSlidePanelCssClassName;
14542   this.GetSlidePanelWrapperElement().className = CssClassesConstants.NavigationBarSlidePanelWrapperCssClassName;
14543   this.PatchElementForMSTouch(slideElement);
14544  },
14545  AdjustControlInternal: function () {
14546   ItemsOwnerBase.prototype.AdjustControlInternal.call(this);
14547   this.AdjustNavigationBarElement();
14548   this.AdjustSlidePanelElement();
14549   this.UpdateItemElementsIfRequired();
14550   if(this.UpdateNavigationButtonsState())
14551    this.AdjustNavigationBarElement();
14552  },
14553  AdjustItemElements: function () {
14554   if(!this.IsAdjustedSize()) {
14555    ItemsOwnerBase.prototype.AdjustItemElements.call(this);
14556    var horizontal = this.IsHorizontalNavigation();
14557    var width = horizontal ? this.GetItemCount() * this.GetItemWidthWithSpacing() - this.GetItemSpacing() : this.GetItemElementWidth();
14558    var height = horizontal ? this.GetItemElementHeight() : this.GetItemCount() * this.GetItemHeightWithSpacing() - this.GetItemSpacing();
14559    ASPx.SetStyles(this.GetSlidePanelElement(), { width: width, height: height });
14560   }
14561  },
14562  AdjustNavigationBarElement: function () {
14563   var styles = this.GetNavigationBarElementsStyles();
14564   ASPx.SetStyles(this.GetNavigationBarElement(), styles.navBarStyle);
14565   ASPx.SetStyles(this.GetSlidePanelWrapperElement(), styles.wrapperStyle);
14566  },
14567  GetNavigationBarElementsStyles: function () {
14568   var isHorizontal = this.IsHorizontalNavigation();
14569   var styles = {};
14570   if(this.CanUseVisibleItemCount())
14571    styles = {
14572     width: isHorizontal ? this.GetItemWidthWithSpacing() * this.GetVisibleItemCount() - this.GetItemSpacing() : this.GetItemElementWidth(),
14573     height: isHorizontal ? this.GetItemElementHeight() : this.GetItemHeightWithSpacing() * this.GetVisibleItemCount() - this.GetItemSpacing()
14574    };
14575   else {
14576    var navigationBar = this.GetNavigationBarElement();
14577    var mainElementWidth = SizeUtils.GetClientWidth(this.GetMainElement(), true);
14578    var mainElementHeight = SizeUtils.GetClientHeight(this.GetMainElement(), true);
14579    styles = {
14580     width: this.IsHorizontalNavigation() ? mainElementWidth : this.GetItemElementWidth(),
14581     height: this.IsHorizontalNavigation() ? this.GetItemElementHeight() : mainElementHeight
14582    };
14583    ASPx.SetStyles(navigationBar, styles);
14584    styles.width = this.IsHorizontalNavigation() ? mainElementWidth - (navigationBar.offsetWidth - mainElementWidth) : this.GetItemElementWidth();
14585    styles.height = this.IsHorizontalNavigation() ? this.GetItemElementHeight() : mainElementHeight - (navigationBar.offsetHeight - mainElementHeight);
14586   }
14587   return {
14588    navBarStyle: {
14589     width: styles.width,
14590     height: styles.height
14591    },
14592    wrapperStyle: {
14593     width: styles.width,
14594     height: styles.height
14595    }
14596   };
14597  },
14598  CanUseVisibleItemCount: function () {
14599   return !this.GetImageSlider().showImageArea && this.GetVisibleItemCount() > 0;
14600  },
14601  AdjustSlidePanelElement: function () {
14602   this.slideElementPosition = this.GetPostDataOffset();
14603   if(this.IsWrapperOverlapsItemCollection())
14604    this.slideElementPosition = (this.GetElementSize(this.GetSlidePanelWrapperElement()) - this.GetElementSize(this.GetSlidePanelElement())) / 2;
14605   this.SetElementTransformPosition(this.GetSlidePanelElement(), this.slideElementPosition);
14606  },
14607  IsWrapperOverlapsItemCollection: function() {
14608   return this.GetElementSize(this.GetSlidePanelWrapperElement()) > this.GetElementSize(this.GetSlidePanelElement());
14609  },
14610  GetPostDataOffset: function () {
14611   var offset = this.IsAdjustedSize() ? 0 : this.GetImageSlider().navBarOffset;
14612   if(offset == 0 && this.IsRtl())
14613    offset = this.GetElementSize(this.GetSlidePanelWrapperElement()) - this.GetElementSize(this.GetSlidePanelElement());
14614   return offset;
14615  },
14616  PrepareItemElement: function (index) {
14617   ItemsOwnerBase.prototype.PrepareItemElement.call(this, index);
14618   this.GetItemElement(index).itemIndex = index;
14619  },
14620  AdjustItemElement: function (index) {
14621   ItemsOwnerBase.prototype.AdjustItemElement.call(this, index);
14622   ASPx.SetStyles(this.GetItemElement(index), this.IsHorizontalNavigation() ? { left
14622: this.GetItemWidthWithSpacing() * index } : { top: this.GetItemHeightWithSpacing() * index });
14623  },
14624  CalculateSize: function () {
14625   if(!this.IsAdjustedSize())
14626    ItemsOwnerBase.prototype.CalculateSize.call(this);
14627  },
14628  CalculateItemElementSize: function (fakeElement) {
14629   this.GetNavigationBarElement().appendChild(fakeElement);
14630   this.fullItemWidth = SizeUtils.GetClientWidth(fakeElement);
14631   this.fullItemHeight = SizeUtils.GetClientHeight(fakeElement);
14632   this.clearItemWidth = SizeUtils.GetClientWidth(fakeElement, true);
14633   this.clearItemHeight = SizeUtils.GetClientHeight(fakeElement, true);
14634  },
14635  ResetControlStyle: function () {
14636   ASPx.SetStyles(this.GetNavigationBarElement(), { width: 0, height: 0 });
14637  },
14638  CanCreateSwipeGestureHandler: function () {
14639   return true;
14640  },
14641  CanHandleSwipeGesture: function(evt) {
14642   return !this.IsWrapperOverlapsItemCollection() && ItemsOwnerBase.prototype.CanHandleSwipeGesture.call(this, evt);
14643  },
14644  InitializeHandlers: function () {
14645   ItemsOwnerBase.prototype.InitializeHandlers.call(this);
14646   ASPx.Evt.AttachEventToElement(this.GetSlidePanelElement(), this.GetMouseUpEventName(), function (evt) { this.OnNavigationBarMouseUp(evt); }.aspxBind(this)); 
14647  },
14648  OnNavigationBarMouseUp: function (evt) {
14649   if(this.CanCandleMouseUpEvent(evt)) {
14650    var index = this.GetItemIndexFromEvent(evt);
14651    if(index != -1) {
14652     this.GetImageSlider().SetActiveItemIndexInternal(index);
14653     this.StopPlayingWhenPaging();
14654     this.GetImageSlider().RaiseThumbnailItemClick();
14655    }
14656   }
14657  },
14658  GetMouseUpEventName: function () {
14659   return ASPx.TouchUIHelper.touchMouseUpEventName;
14660  },
14661  CanCandleMouseUpEvent: function (evt) {
14662   return !this.IsExecutedGesture() && ASPx.Evt.IsLeftButtonPressed(evt);
14663  },
14664  GetItemIndexFromEvent: function (evt) {
14665   var itemElement = ASPx.GetParentByClassName(ASPx.Evt.GetEventSource(evt),this.GetItemElementCssClass());
14666   return itemElement ? itemElement.itemIndex : -1;
14667  },
14668  GetImageSizeMode: function () {
14669   return this.GetImageSlider().thumbImageSizeMode;
14670  },
14671  GetMainElement: function () {
14672   return this.GetImageSlider().GetMainElement();
14673  },
14674  GetSlidePanelWrapperElement: function () {
14675   return this.slidePanelWrapperElement;
14676  },
14677  GetNavigationBarElement: function () {
14678   return this.navigationBarElement;
14679  },
14680  GetElementSize: function (element, clear) {
14681   return this.IsHorizontalNavigation() ? SizeUtils.GetClientWidth(element, clear) : SizeUtils.GetClientHeight(element, clear);
14682  },
14683  GetItemWidthWithSpacing: function () {
14684   return this.GetItemElementWidth() + this.GetItemSpacing();
14685  },
14686  GetItemHeightWithSpacing: function () {
14687   return this.GetItemElementHeight() + this.GetItemSpacing();
14688  },
14689  GetPositionMode: function () {
14690   return this.GetImageSlider().GetNavigationBarPosition();
14691  },
14692  GetItemSpacing: function () {
14693   return this.GetImageSlider().itemSpacing;
14694  },
14695  IsSinglePagingMode: function () {
14696   return this.GetImageSlider().navBarPagingMode == NavigationBarPagingModeEnum.Single;
14697  },
14698  GetVisibleItemCount: function () {
14699   return this.GetImageSlider().visibleItemsCount;
14700  },
14701  GetSlideElementPosition: function () {
14702   return Math.round(this.slideElementPosition);
14703  },
14704  GetWidth: function () {
14705   var navigationBarElement = this.GetNavigationBarElement();
14706   var currentStyle = ASPx.GetCurrentStyle(navigationBarElement);
14707   var width = SizeUtils.GetClientWidth(navigationBarElement) + ASPx.PxToInt(currentStyle.marginLeft) + ASPx.PxToInt(currentStyle.marginRight);
14708   return width > 0 ? width : 0;
14709  },
14710  GetHeight: function () {
14711   var navigationBarElement = this.GetNavigationBarElement();
14712   var currentStyle = ASPx.GetCurrentStyle(navigationBarElement);
14713   var height = SizeUtils.GetClientHeight(navigationBarElement) + ASPx.PxToInt(currentStyle.marginTop) + ASPx.PxToInt(currentStyle.marginBottom);
14714   return height > 0 ? height : 0;
14715  }
14716 });
14717 var NavigationBarThumbnailStrategy = ASPx.CreateClass(NavigationBarStrategy, {
14718  constructor: function (imageSlider) {
14719   this.selectedStateElement = null;
14720   this.hoverStateElementSize = {};
14721   this.innerHoverStateElementSize = {};
14722   this.loadingElenentSize = {};
14723   this.setActiveIndexCounter = 0;
14724   this.constructor.prototype.constructor.call(this, imageSlider);
14725  },
14726  BeginSetActiveIndex: function () {
14727   this.setActiveIndexCounter++;
14728  },
14729  EndSetActiveIndex: function () {
14730   this.setActiveIndexCounter--;
14731  },
14732  NeedOffsetCorrection: function () {
14733   return this.setActiveIndexCounter > 0 && this.GetImageSlider().extremeItemClickMode == ExtremeItemClickModeEnum.SelectAndSlide;
14734  },
14735  GetNavigationButtonsPosition: function () {
14736   return this.GetImageSlider().thumbNavBtnsPos;
14737  },
14738  GetItemIndexFromEvent: function(evt) {
14739   var result = NavigationBarStrategy.prototype.GetItemIndexFromEvent.call(this, evt);
14740   if(result == -1) {
14741    var eventSource = ASPx.Evt.GetEventSource(evt);
14742    var selectedItem = this.GetSelectedStateElement();
14743    if (eventSource.parentNode == selectedItem || eventSource == selectedItem)
14744     result = this.GetRtlIndex(this.GetImageSlider().GetActiveItemIndex());
14745   }
14746   return result;
14747  },
14748  SetActiveItemIndexInternal: function (index, preventAnimation) {
14749   this.BeginSetActiveIndex();
14750   NavigationBarStrategy.prototype.SetActiveItemIndexInternal.call(this, index, preventAnimation);
14751   this.EndSetActiveIndex();
14752  },
14753  SetActiveItemVisually: function (index, preventAnimation) {
14754   this.SelectItemElement(index);
14755   this.MoveSelectedItem(index, preventAnimation);
14756  },
14757  SelectItemElement: function (index) {
14758   var currentItemElement = this.GetItemElement(index);
14759   var prevItemElement = this.GetItemElement(this.GetPrevItemIndex());
14760   if(prevItemElement)
14761    prevItemElement.className = prevItemElement.className.replace(CssClasse
14761sConstants.NavigationBarSelectedStateCssClassName, "");
14762   if(currentItemElement && !ASPx.ElementContainsCssClass(currentItemElement, CssClassesConstants.NavigationBarSelectedStateCssClassName))
14763    currentItemElement.className += CssClassesConstants.NavigationBarSelectedStateCssClassName;
14764  },
14765  MoveSelectedItem: function (index, preventAnimation) {
14766   var selectedStateElement = this.GetSelectedStateElement();
14767   var position = (this.GetItemElementSize() + this.GetItemSpacing()) * index;
14768   preventAnimation = this.GetImageSlider().disableSelectedStateAnimation || preventAnimation; 
14769   if(preventAnimation)
14770    this.SetElementTransformPosition(selectedStateElement, position);
14771   else
14772    ASPx.AnimationHelper.slideTo(selectedStateElement, {
14773     to: position,
14774     direction: this.IsHorizontalNavigation() ? ASPx.AnimationHelper.SLIDE_HORIZONTAL_DIRECTION : ASPx.AnimationHelper.SLIDE_VERTICAL_DIRECTION
14775    });
14776  },
14777  SlideItemsPortionPageMode: function (backward) {
14778   this.PerformSlideToExtremeInvisibleElement(backward, true, !backward);
14779  },
14780  PerformRollBack: function () {
14781   NavigationBarStrategy.prototype.PerformRollBack.call(this);
14782  },
14783  UpdateItemElementsIfRequired: function () {
14784   NavigationBarStrategy.prototype.UpdateItemElementsIfRequired.call(this);
14785   if(this.GetImageLoadMode() != LoadModeEnum.AllImages)
14786    this.SelectItemElement(this.GetActiveItemIndex());
14787  },
14788  CanCreateNavigationButtons: function () {
14789   if(!this.CanUseVisibleItemCount())
14790    return true;
14791   return this.GetVisibleItemCount() < this.GetItemCount();
14792  },
14793  CreateNavigationButtons: function () {
14794   if(this.GetNavigationBtnsVisibilityMode() == ElementVisibilityModeEnum.None)
14795    return null;
14796   if(this.GetNavigationButtonsPosition() == NavigationBarButtonPositionEnum.Outside)
14797    return new OutsideNavigationButtons(this);
14798   return new NavigationButtons(this);
14799  },
14800  CreateControlHierarchy: function () {
14801   NavigationBarStrategy.prototype.CreateControlHierarchy.call(this);
14802   this.CreateSelectedStateElement();
14803  },
14804  CreateItemElement: function (index) {
14805   var itemElement = NavigationBarStrategy.prototype.CreateItemElement.call(this, index);
14806   itemElement.appendChild(this.CreateLoadingElement());
14807   if(this.IsEnabled() && !ASPx.Browser.TouchUI)
14808    itemElement.appendChild(this.CreateHoverStateElement());
14809   return itemElement;
14810  },
14811  CreateLoadingElement: function(itemElement) {
14812   var element = this.CreateDiv();
14813   element.className = CssClassesConstants.LoadingElement;
14814   return element;
14815  },
14816  CreateHoverStateElement: function (itemElement) {
14817   var element = this.CreateDiv();
14818   element.className = CssClassesConstants.NavigationBarHoverStateElementCssClassName;
14819   element.appendChild(this.CreateDiv());
14820   return element;
14821  },
14822  CreateSelectedStateElement: function () {
14823   this.selectedStateElement = this.CreateDiv();
14824   this.selectedStateElement.appendChild(this.CreateDiv()); 
14825   this.GetSlidePanelElement().appendChild(this.selectedStateElement);
14826  },
14827  PrepareControlHierarchy: function () {
14828   NavigationBarStrategy.prototype.PrepareControlHierarchy.call(this);
14829   ASPx.SetStyles(this.GetSelectedStateElement(), {
14830    className: this.GetImageSlider().thSelCssCl,
14831    cssText: this.GetImageSlider().thSelStyle
14832   });
14833  },
14834  PrepareItemElement: function (index) {
14835   NavigationBarStrategy.prototype.PrepareItemElement.call(this, index);
14836   var stateController = this.GetStateController();
14837   if(this.IsEnabled() && !ASPx.Browser.TouchUI && stateController && this.GetEnableItemHoverState()) {
14838    var itemElement = this.GetItemElement(index);
14839    itemElement.id = this.GetClientControlName() + "_nb_" + index;
14840    stateController.AddHoverItem(itemElement.id, [CssClassesConstants.NavigationBarHoverStateCssClassName], [""], [""], null, null, false);
14841   }
14842  },
14843  GetEnableItemHoverState: function () {
14844   return true;
14845  },
14846  CalculateItemElementSize: function (fakeElement) {
14847   NavigationBarStrategy.prototype.CalculateItemElementSize.call(this, fakeElement);
14848   if(this.IsEnabled() && !ASPx.Browser.TouchUI)
14849    this.CalculateHoverStateElement(fakeElement);
14850   this.CalculateLoadingElement(fakeElement);
14851  },
14852  CalculateHoverStateElement: function (fakeElement) { 
14853   var actualWidth = this.GetItemElementWidth();
14854   var actualHeight = this.GetItemElementHeight();
14855   var hoverStateElement = this.CreateHoverStateElement();
14856   fakeElement.appendChild(hoverStateElement);
14857   ASPx.SetStyles(hoverStateElement, { display: "block" });
14858   this.hoverStateElementSize = this.GetBorderBoxSize(hoverStateElement, this.GetItemElementWidth(), this.GetItemElementHeight());
14859   var innerDiv = this.GetFirstChild(hoverStateElement);
14860   this.innerHoverStateElementSize = this.GetBorderBoxSize(innerDiv, this.hoverStateElementSize.width, this.hoverStateElementSize.height);
14861  },
14862  CalculateLoadingElement: function(fakeElement) {
14863   var loadingElement = this.CreateLoadingElement();
14864   fakeElement.appendChild(loadingElement);
14865   this.loadingElenentSize.width = loadingElement.offsetWidth;
14866   this.loadingElenentSize.height = loadingElement.offsetHeight;
14867  },
14868  AdjustControlInternal: function () {
14869   NavigationBarStrategy.prototype.AdjustControlInternal.call(this);
14870   this.AdjustSelectedStateElement();
14871  },
14872  AdjustItemElement: function (index) {
14873   NavigationBarStrategy.prototype.AdjustItemElement.call(this, index);
14874   if(this.IsEnabled() && !ASPx.Browser.TouchUI)
14875    this.AdjustHoverStateElement(index);
14876   this.AdjustLoadingElement(index);
14877  },
14878  AdjustLoadingElement: function(index) {
14879   var loadingElement = this.GetLoadingElement(index);
14880   loadingElement.style.left = (this.GetItemElementWidth() - this.loadingElenentSize.width) / 2 + "px";
14881   loadingElement.style.top = (this.GetItemElementHeight() - this.loadingElenentSize.height) / 2 + "px";
14882  },
14883  AdjustHoverStateElement: function (index) {
14884   var hoverStateElement = this.GetHoverStateElement(index);
14885   ASPx.SetStyles(hoverStateElement, this.hoverStateElementSize);
14886   ASPx.SetStyles(this.GetFirstChild(hoverStateElement), this.innerHoverStateElementSize);
14887  },
14888  AdjustSelectedStateElement: function () {
14889   var selectedStateElement = this.GetSelectedStateElement();
14890   var size = this.GetBorderBoxSize(selectedStateElement, this.GetItemElementWidth(), this.GetItemElementHeight());
14891   ASPx.SetStyles(selectedStateElement, size);
14892   var innerDiv = this.GetFirstChild(selectedStateElement);
14893   size = this.GetBorderBoxSize(selectedStateElement, size.width, size.height);
14894   ASPx.SetStyles(innerDiv, size);
14895  },
14896  GetHoverStateElement: function (index) {
14897   return ASPx.GetChildByClassName(this.GetItemElement(index), CssClassesConstants.NavigationBarHoverStateElementCssClassName);
14898  },
14899  GetLoadingElement: function (index) {
14900   return ASPx.GetChildByClassName(this.GetItemElement(index), CssClassesConstants.LoadingElement);
14901  },
14902  GetSelectedStateElement: function () {
14903   return this.selectedStateElement;
14904  },
14905  GetItemElementCssClass: function () {
14906   return this.GetImageSlider().thCssCl;
14907  },
14908  GetItemElementStyle: function () {
14909   return this.GetImageSlider().thStyle;
14910  },
14911  CalculateSlideElementPosition: function (index, snapToLeft) {
14912   var prevSlideElementPosition = this.slideElementPosition;
14913   NavigationBarStrategy.prototype.CalculateSlideElementPosition.call(this, index, snapToLeft);
14914   this.slideElementPosition = this.CorrectSelectAndSlideOffsetPosition(index, prevSlideElementPosition, this.slideElementPosition);
14915  },
14916  IsSnapToLeft: function (index) {
14917   var shownItemIndexes = this.GetShownItemIndexes(true);
14918   for(var i = 0; i < shownItemIndexes.length; i++)
14919    if(shownItemIndexes[i] == index)
14920     return i < shownItemIndexes.length / 2;
14921   return index < shownItemIndexes[0];
14922  },
14923  SlideItemsPortionSingleMode: function (backward) {
14924   var considerSize = new Date() - this.lastSlideItemsPortionDate >= 350;
14925   this.PerformSlideToExtremeInvisibleElement(backward, considerSize, backward);
14926   this.lastSlideItemsPortionDate = new Date();
14927  },
14928  PerformSlideToExtremeInvisibleElement: function (backward, considerSize, preventAnimation) {
14929   var shownItemIndexes = this.GetShownItemIndexes(false);
14930   var lastIndex = backward ? -1 : this.GetItemCount();
14931   var incValue = backward ? -1 : 1;
14932   for(var index = shownItemIndexes[backward ? 0 : shownItemIndexes.length - 1]; index != lastIndex; index += incValue)
14933    if(!this.IsVisibleItemElement(index, considerSize)) {
14934     this.SlideToItem(index, preventAnimation);
14935     break;
14936    }
14937  },
14938  GetShownItemIndexes: function (getUncroppedItems) {
14939   var result = [];
14940   var itemSize = this.GetItemElementSize();
14941   var constOffset = this.GetElementTransformPosition(this.GetSlidePanelElement());
14942   var itemFullSize = itemSize + this.GetItemSpacing();
14943   var minValue = getUncroppedItems ? -1 : -itemSize;
14944   var maxValue = getUncroppedItems ? this.GetSlidePanelWrapperSize() - itemSize + 1 : this.GetSlidePanelWrapperSize();
14945   var tempValue = null;
14946   for(var index = 0; index < this.GetItemCount() ; index++) {
14947    tempValue = constOffset + itemFullSize * index;
14948    if(tempValue > minValue && tempValue < maxValue)
14949     result.push(index);
14950   }
14951   return result;
14952  },
14953  OnImageLoad: function (image) {
14954   NavigationBarStrategy.prototype.OnImageLoad.call(this, image);
14955   var element = this.GetLoadingElement(image.dxIndex);
14956   if(element)
14957    element.style.display = "none";
14958  },
14959  CorrectSelectAndSlideOffsetPosition: function (nextItemIndex, prevPos, nextPos) {
14960   var index = this.GetActiveItemIndex();
14961   if(!this.NeedOffsetCorrection() || nextItemIndex == index)
14962    return nextPos;
14963   var itemElementSize = this.GetItemElementSize();
14964   var sliderWrapperSize = this.GetSlidePanelWrapperSize();
14965   if(sliderWrapperSize < (itemElementSize * 3)) {
14966    var offsetDelta = Math.abs(Math.abs(nextPos) - Math.abs(prevPos));
14967    var itemSpacing = this.GetItemSpacing();
14968    var itemPosition = (itemElementSize + itemSpacing) * index;
14969    var itemPositionInSlideWrapper = this.ConvertItemPositionToSlideWrapperPosition(itemPosition) +
14970     (nextItemIndex < index ? offsetDelta : -offsetDelta);
14971    nextPos += (sliderWrapperSize - itemElementSize) / 2 - itemPositionInSlideWrapper;
14972   }
14973   return nextPos;
14974  },
14975  GetBorderBoxSize: function (element, width, height) {
14976   ASPx.SetStyles(element, { width: width, height: height });
14977   if(element.offsetWidth > width)
14978    width -= element.offsetWidth - width;
14979   if(element.offsetHeight > height)
14980    height -= element.offsetHeight - height;
14981   return { width: width, height: height };
14982  },
14983  GetFirstChild: function (parent) {
14984   return parent.children[0];
14985  },
14986  GetSlidePanelWrapperSize: function () {
14987   return this.GetElementSize(this.GetSlidePanelWrapperElement());
14988  },
14989  GetNavigationBarElementsStyles: function () {
14990   var styles = NavigationBarStrategy.prototype.GetNavigationBarElementsStyles.call(this);
14991   if(this.GetNavigationButtonsPosition() == NavigationBarButtonPositionEnum.Outside && this.navigationButtons) {
14992    var prevButtonSize = this.navigationButtons.GetPrevButtonWrapperSize();
14993    var nextButtonSize = this.navigationButtons.GetNextButtonWrapperSize();
14994    var isHorizontal = this.IsHorizontalNavigation();
14995    var styleName = isHorizontal ? "width" : "height";
14996    if(this.CanUseVisibleItemCount())
14997     styles.navBarStyle[styleName] += prevButtonSize[styleName] + nextButtonSize[styleName];
14998    else
14999     styles.wrapperStyle[styleName] -= prevButtonSize[styleName] + nextButtonSize[styleName];
15000    styles.wrapperStyle[isHorizontal ? "left" : "top"] = prevButtonSize[styleName];
15001   }
15002   return styles;
15003  }
15004 });
15005 var NavigationBarDotsStrategy = ASPx.CreateClass(NavigationBarStrategy, {
15006  constructor: function (imageSlider) {
15007   this.cloneElement = null;
15008   this.constructor.prototype.constructor.call(this, imageSlider);
15009  },
15010  Initialize: function () {
15011   NavigationBarStrategy.prototype.Initialize.call(this);
15012   this.cloneElement = ASPx.CreateHtmlElementFromString(this.GetImageSlider().dbh);
15013  },
15014  SetActiveItemVisually: function (index, preventAnimation) {
15015   var stateController = this.GetStateController();
15016   if(stateController) {
15017    if(this.GetPrevItemIndex() != -1)
15018     stateController.DeselectElementBySrcElement(this.GetItemElement(this.GetPrevItemIndex()));
15019    stateController.SelectElementBySrcElement(this.GetItemElement(index));
15020   }
15021  },
15022  GetImageLoadMode: function () {
15023   return LoadModeEnum.AllImages;
15024  },
15025  OnNavigationBarMouseUp: function (evt) {
15026   ASPx.ClearHoverState();
15027   NavigationBarStrategy.prototype.OnNavigationBarMouseUp.call(this, evt);
15028  },
15029  CanCandleMouseUpEvent: function (evt) {
15030   if(ASPx.Browser.IE && ASPx.Browser.Version < 9)
15031    return !this.IsExecutedGesture();
15032   return NavigationBarStrategy.prototype.CanCandleMouseUpEvent.call(this, evt);
15033  }, 
15034  GetMouseUpEventName: function () {
15035   return ASPx.Browser.IE && ASPx.Browser.Version < 9 ? "click" : ASPx.TouchUIHelper.touchMouseUpEventName; 
15036  },
15037  GetNavigationBtnsVisibilityMode: function () {
15038   return ElementVisibilityModeEnum.None;
15039  },
15040  CreateItemElement: function (index) {
15041   var itemElement = this.CreateDiv();
15042   itemElement.id = this.GetItemElementId(index);
15043   return itemElement;
15044  },
15045  PrepareControlHierarchy: function () {
15046   NavigationBarStrategy.prototype.PrepareControlHierarchy.call(this);
15047   var imageSlider = this.GetImageSlider();
15048   var stateController = this.GetStateController();
15049   if(!stateController)
15050    return;
15051   this.ForEachItem(function (i) {
15052    if(this.IsEnabled()) {
15053     stateController.AddHoverItem(this.GetItemElementId(i), [imageSlider.dotHCssCl], [imageSlider.dotHStyle],
15054      null, [imageSlider.dotHSprt], [""], false);
15055     stateController.AddPressedItem(this.GetItemElementId(i), [imageSlider.dotPCssCl], [imageSlider.dotPStyle],
15056      null, [imageSlider.dotPSprt], [""], false);
15057    }
15058    stateController.AddSelectedItem(this.GetItemElementId(i), [imageSlider.dotSCssCl], [imageSlider.dotSStyle],
15059     null, [imageSlider.dotSSprt], [""], false);
15060   });
15061  },
15062  AdjustImageElement: function (index) {
15063  },
15064  GetItemElementCssClass: function () {
15065   return this.cloneElement.className;
15066  },
15067  GetItemElementStyle: function () {
15068   return this.cloneElement.style.cssText;
15069  },
15070  GetItemElementId: function (index) {
15071   return this.GetClientControlName() + "_dot_" + index;
15072  }
15073 });
15074 var ItemElementsManagerBase = ASPx.CreateClass(null, {
15075  constructor: function (itemsOwner) {
15076   this.itemsOwner = itemsOwner;
15077   this.timerId == -1
15078   this.itemCollection = [];
15079  },
15080  GetOwner: function () {
15081   return this.itemsOwner;
15082  },
15083  GetCollection: function () {
15084   if(this.IsEnablePartialLoading())
15085    return this.itemCollection;
15086   return ASPx.GetChildNodesByTagName(this.GetOwner().GetItemsContainer(), "DIV");
15087  },
15088  HasItem: function (index) {
15089   return !!this.GetCollection()[index];
15090  },
15091  SaveItem: function (index, item) {
15092   if(this.IsEnablePartialLoading())
15093    this.itemCollection[index] = item;
15094  },
15095  GetImageLoadMode: function () {
15096   return this.GetOwner().GetImageLoadMode();
15097  },
15098  IsEnablePartialLoading: function () {
15099   return this.GetImageLoadMode() != LoadModeEnum.AllImages;
15100  },
15101  CreateItemsIfRequired: function () {
15102   if(this.GetImageLoadMode() == LoadModeEnum.AllImages)
15103    this.GetOwner().CreateItemElements();
15104  },
15105  PrepareItemsIfRequired: function () {
15106   if(this.GetImageLoadMode() == LoadModeEnum.AllImages)
15107    this.GetOwner().PrepareItemElements();
15108  },
15109  AdjustItemsIfRequired: function () {
15110   var owner = this.GetOwner();
15111   for(var i = 0; i < owner.GetItemCount() ; i++) {
15112    if(this.IsEnablePartialLoading() && !this.HasItem(i))
15113     continue;
15114    this.GetOwner().AdjustItemElement(i);
15115    this.GetOwner().AdjustImageElement(i);
15116   }
15117  },
15118  UpdateHierarchyIfRequired: function () {
15119   if(this.IsEnablePartialLoading()) {
15120    this.timerId = ASPx.Timer.ClearTimer(this.timerId);
15121    this.UpdateHierarchyCore();
15122   }
15123  },
15124  CreateItemAndAppend: function (index, parent) {
15125   var owner = this.GetOwner();
15126   var element = owner.CreateItemElement(index);
15127   this.SaveItem(index, element);
15128   parent.appendChild(element);
15129   owner.PrepareItemElement(index);
15130   owner.AdjustItemElement(index);
15131   owner.AdjustImageElement(index);
15132  },
15133  RemoveItem: function (index) {
15134   if(this.GetImageLoadMode() == LoadModeEnum.DynamicLoadAndCache)
15135    return;
15136   var owner = this.GetOwner();
15137   var element = owner.GetItemElement(index);
15138   if(element) {
15139    var image = owner.GetImageElement(index);
15140    if(image)
15141     owner.DetachLoadEvents(image);
15142    this.itemCollection[index] = undefined;
15143    ASPx.RemoveElement(element);
15144   }
15145  },
15146  UpdateHierarchyCore: function () {
15147   ;
15148  },
15149  GetDelay: function () {
15150   return 450;
15151  },
15152  UpdateHierarchyAfterDelayIfRequired: function () {
15153   if(this.IsEnablePartialLoading() && this.timerId == -1)
15154    this.timerId = window.setTimeout(function () { this.UpdateHierarchyIfRequired(); }.aspxBind(this), this.GetDelay());
15155  }
15156 });
15157 var ImageAreaItemElementsManager = ASPx.CreateClass(ItemElementsManagerBase, {
15158  constructor: function (imageAreaStrategy) {
15159   this.constructor.prototype.constructor.call(this, imageAreaStrategy);
15160  },
15161  GetDelay: function () {
15162   return this.GetOwner().GetImageSlider().animationDuration + 50;
15163  },
15164  UpdateHierarchyCore: function () {
15165   var owner = this.GetOwner();
15166   var activeItemIndex = owner.GetActiveItemIndex();
15167   var prevItemIndex = owner.GetPrevItemIndex();
15168   if(prevItemIndex == -1) 
15169    prevItemIndex = 0;
15170   var isForwardDirection = (activeItemIndex - prevItemIndex) >= 0;
15171   var fragment = owner.CreateDocumentFragment();
15172   var itemsContainer = owner.GetItemsContainer();
15173   if(!this.HasItem(activeItemIndex))
15174    this.CreateItemAndAppend(activeItemIndex, fragment || itemsContainer);
15175   if(this.CanUpdateItemElements(isForwardDirection, isForwardDirection ? activeItemIndex + 1 : activeItemIndex - 1)) {
15176    for(var i = 0; i < owner.GetItemCount() ; i++) {
15177     if(this.CanRemoveItem(i, activeItemIndex, prevItemIndex, isForwardDirection))
15178      this.RemoveItem(i);
15179     else if(!this.HasItem(i))
15180      this.CreateItemAndAppend(i, fragment || itemsContainer);
15181    }
15182   }
15183   if(fragment)
15184    itemsContainer.appendChild(fragment);
15185  },
15186  CanRemoveItem: function (index, activeItemIndex, prevItemIndex, forwardDirection) {
15187   var visibleItemCount = 6;
15188   var result = forwardDirection ? (index < activeItemIndex || index > (activeItemIndex + visibleItemCount)) :
15189     (index > activeItemIndex || index < (activeItemIndex - visibleItemCount));
15190   return result && prevItemIndex != index; 
15191  },
15192  CanUpdateItemElements: function (forwardDirection, followingItemIndex) {
15193   return forwardDirection ? followingItemIndex < this.GetOwner().GetItemCount() && !this.HasItem(followingItemIndex) :
15194    followingItemIndex > 0 && !this.HasItem(followingItemIndex);
15195  }
15196 });
15197 var LoopImageAreaItemElementsManager = ASPx.CreateClass(ItemElementsManagerBase, {
15198  constructor: function (imageAreaStrategy) {
15199   this.constructor.prototype.constructor.call(this, imageAreaStrategy);
15200  },
15201  UpdateHierarchyCore: function () {
15202   var owner = this.GetOwner();
15203   var activeIndex = owner.GetActiveItemIndex();
15204   var fragment = owner.CreateDocumentFragment();
15205   var itemsContainer = owner.GetItemsContainer();
15206   if(!this.HasItem(activeIndex))
15207    this.CreateItemAndAppend(activeIndex, fragment || itemsContainer);
15208   var activeItem = owner.GetItemElement(activeIndex);
15209   var nextIndex = activeIndex + 1;
15210   if(nextIndex == owner.GetItemCount())
15211    nextIndex = 0;
15212   if(!this.HasItem(nextIndex)) {
15213    this.CreateItemAndAppend(nextIndex, fragment || itemsContainer);
15214    var item = owner.GetItemElement(nextIndex);
15215    item.dxPosition = activeItem.dxPosition + owner.GetItemElementSize();
15216    owner.SetItemPosition(item);
15217   }
15218   var prevIndex = activeIndex - 1;
15219   var prevIndex = activeIndex - 1;
15220   if(prevIndex < 0)
15221    prevIndex = owner.GetItemCount() - 1;
15222   if(!this.HasItem(prevIndex)) {
15223    this.CreateItemAndAppend(prevIndex, fragment || itemsContainer);
15224    var item = owner.GetItemElement(prevIndex);
15225    item.dxPosition = activeItem.dxPosition - owner.GetItemElementSize();
15226    owner.SetItemPosition(item);
15227   }
15228   for(var i = 0; i < owner.GetItemCount() ; i++)
15229    if(i != activeIndex && i != prevIndex && i != nextIndex && owner.GetPrevItemIndex() != i && owner.GetItemElement(i))
15230     this.RemoveItem(i);
15231   if(fragment)
15232    itemsContainer.appendChild(fragment);
15233  }
15234 });
15235 var NavigationBarItemElementsManager = ASPx.CreateClass(ItemElementsManagerBase, {
15236  constructor: function (navigationBarStrategy) {
15237   this.constructor.prototype.constructor.call(this, navigationBarStrategy);
15238  },
15239  CreateDummyItem: function (index, parent) {
15240   if(!this.HasItem(index))
15241    this.CreateAndPrepareItemElement(index, parent);
15242   else if(this.GetImageLoadMode() != LoadModeEnum.DynamicLoadAndCache) {
15243    var owner = this.GetOwner();
15244    var element = owner.GetItemElement(index);
15245    if(element) {
15246     element.style.backgroundImage = "";
15247     var image = owner.GetImageElement(index);
15248     if(image)
15249      owner.DetachLoadEvents(image);
15250     ASPx.RemoveElement(image);
15251     ASPx.RemoveElement(owner.GetCanvasElement(index));
15252     var el = owner.GetLoadingElement(index)
15253     if(el) el.style.display = "";
15254    }
15255    this.SetDummyFlagToElement(index, true);
15256   }
15257  },
15258  SetDummyFlagToElement: function (index, isDummy) {
15259   var element = this.GetOwner().GetItemElement(index);
15260   if(element)
15261    element.isDummy = isDummy;
15262  },
15263  IsElementDummy: function (index) {
15264   var element = this.GetOwner().GetItemElement(index);
15265   if(element)
15266    return !!element.isDummy;
15267   return false;
15268  },
15269  CreateItemAndAppend: function (index, parent) {
15270   if(!this.HasItem(index))
15271    this.CreateAndPrepareItemElement(index, parent);
15272   if(this.IsElementDummy(index)) {
15273    this.SetDummyFlagToElement(index, false);
15274    this.GetOwner().AdjustImageElement(index);
15275   }
15276  },
15277  CreateAndPrepareItemElement: function (index, parent) {
15278   var owner = this.GetOwner();
15279   var element = owner.CreateItemElement(index);
15280   this.SaveItem(index, element);
15281   parent.appendChild(element);
15282   owner.PrepareItemElement(index);
15283   owner.AdjustItemElement(index);
15284   this.SetDummyFlagToElement(index, true);
15285  },
15286  UpdateHierarchyCore: function () {
15287   var owner = this.GetOwner();
15288   var navigationBarSize = owner.GetElementSize(owner.GetSlidePanelWrapperElement()),
15289    slidePanelPosition = owner.GetElementTransformPosition(owner.GetSlidePanelElement());
15290   var fragment = owner.CreateDocumentFragment();
15291   var itemsContainer = owner.GetItemsContainer();
15292   var itemFullSize = owner.GetItemElementSize() + owner.GetItemSpacing();
15293   var lPos = Math.min(-navigationBarSize * 0.3, -itemFullSize);
15294   var rPos = Math.max(navigationBarSize * 1.3, navigationBarSize + itemFullSize);
15295   var lDummyPos = lPos - navigationBarSize;
15296   var rDummyPos = rPos + navigationBarSize;
15297   var itemPos = 0;
15298   for(var i = 0; i < owner.GetItemCount() ; i++) {
15299    itemPos = slidePanelPosition + itemFullSize * i;
15300    if(itemPos > lDummyPos && itemPos < rDummyPos && (itemPos < lPos || itemPos > rPos))
15301     this.CreateDummyItem(i, fragment || itemsContainer);
15302    else {
15303     if(itemPos <= lDummyPos || itemPos >= rDummyPos)
15304      this.RemoveItem(i);
15305     else
15306      this.CreateItemAndAppend(i, fragment || itemsContainer);
15307    }
15308   }
15309   if(fragment)
15310    itemsContainer.appendChild(fragment);
15311  }
15312 });
15313 var ASPxClientImageSlider = ASPx.CreateClass(ASPxClientControl, {
15314  constructor: function (name) {
15315   this.constructor.prototype.constructor.call(this, name);
15316   this.activeItemIndex = 0;
15317   this.imageAreaStrategy = null; 
15318   this.navigationBarStrategy = null; 
15319   this.passePartoutElement = null;
15320   this.hiddenField = null;
15321   this.slideShowEnabled = false;
15322   this.templateCreated = false;
15323   this.timerID = -1;
15324   this.defaultControlSize = { width: "", height: "" };
15325   this.showImageArea = true;
15326   this.showNavBar = true;
15327   this.seoFriendlyItems = [];
15328   this.items = []; 
15329   this.enableLoopNavigation = false;
15330   this.enableKeyboardSupport = true;
15331   this.enablePagingByClick = true;
15332   this.enablePagingGestures = true;
15333   this.extremeItemClickMode = 0;
15334   this.animationDuration = 400;
15335   this.allowMouseWheel = false;
15336   this.imageLoadMode = 1;
15337   this.imageSizeMode = ASPx.ImageControlUtils.ImageSizeModeEnum.ActualSizeOrFit;
15338   this.thumbImageSizeMode = ASPx.ImageControlUtils.ImageSizeModeEnum.FitAndCrop;
15339   this.animationType = 0;
15340   this.navDirection = 0;
15341   this.itemSpacing = 5;
15342   this.target = "";
15343   this.hasNavigateUrls = false;
15344   this.hasTemplates = false;
15345   this.navBtnsVbl = 2;
15346   this.itemTxtVbl = 3;
15347   this.interval = 5000;
15348   this.autoPlay = false;
15349   this.stopPlayingWhenPaging = false;
15350   this.stopPlayingWhenPagingExecuted = false;
15351   this.pausePlayingWhenMouseOver = false;
15352   this.playPauseBtnVbl = 0;
15353   this.visibleItemsCount = 0;
15354   this.navBarPos = 0;
15355   this.navBarPagingMode = 0;
15356   this.thumbNavBtnsVbl = 2;
15357   this.thumbNavBtnsPos = 0;
15358   this.navBarOffset = 0;
15359   this.passePartoutStyle = "";
15360   this.imgAreaCssCl = "";
15361   this.imgAreaStyle = "";
15362   this.itemCssCl = "";
15363   this.itemStyle = "";
15364   this.navBarCssCl = "";
15365   this.navBarStyle = "";
15366   this.thCssCl = "";
15367   this.thStyle = "";
15368   this.thSelCssCl = "";
15369   this.thSelStyle = "";
15370   this.itemTxtCssCl = "";
15371   this.itemTxtStyle = "";
15372   this.dotHSprt = null;
15373   this.dotHCssCl = "";
15374   this.dotHStyle = "";
15375   this.dotPSprt = null;
15376   this.dotPCssCl = "";
15377   this.dotPStyle = "";
15378   this.dotSSprt = null;
15379   this.dotSCssCl = "";
15380   this.dotSStyle = "";
15381   this.dbh = "";
15382   this.playBH = "";
15383   this.pauseBH = "";
15384   this.pbh = "";
15385   this.nbh = "";
15386   this.nbpbh = "";
15387   this.nbnbh = "";
15388   this.sizingConfig.adjustControl = true;
15389   this.disableSelectedStateAnimation = false;
15390   this.ActiveItemChanged = new ASPxClientEvent();
15391   this.ItemClick = new ASPxClientEvent();
15392   this.ThumbnailItemClick = new ASPxClientEvent();
15393   this.StrategiesCreated = new ASPxClientEvent();
15394  },
15395  InlineInitialize: function () {
15396   ASPxClientControl.prototype.InlineInitialize.call(this);
15397   this.PopulateItemsSeoMode();
15398  },
15399  Initialize: function () {
15400   ASPxClientControl.prototype.Initialize.call(this);
15401   if(this.hasTemplates)
15402    for(var i = 0; i < this.seoFriendlyItems.length; i++) {
15403     this.items[i].s = this.seoFriendlyItems[i].s;
15404     this.items[i].ts = this.seoFriendlyItems[i].ts;
15405     this.items[i].t = this.seoFriendlyItems[i].t;
15406     this.items[i].u = this.seoFriendlyItems[i].u;
15407    }
15408   this.seoFriendlyItems = null;
15409   this.CreateControlHierarchy();
15410   this.PrepareControlHierarchy();
15411   this.InitializeElementsSize();
15412  },
15413  PopulateItemsSeoMode: function () {
15414   var elements = ASPx.GetNodesByTagName(this.GetMainElement(), "IMG");
15415   if(elements.length > 0)
15416    this.populateItemCollection(elements, this.hasTemplates ? this.seoFriendlyItems : this.items);
15417  },
15418  populateItemCollection: function(imageCollection, itemsCollection, image) {
15419   var index = 0;
15420   while(image = imageCollection[0]) {
15421    var collectionItem = (itemsCollection[index] || (itemsCollection[index] = {}));
15422    collectionItem.s = ASPx.Attr.GetAttribute(image, "src");
15423    collectionItem.t = ASPx.Attr.GetAttribute(image, "alt");
15424    if(image.parentNode.tagName == "A") {
15425     collectionItem.u = ASPx.Attr.GetAttribute(image.parentNode, "href");
15426     ASPx.RemoveElement(image.parentNode);
15427    } else 
15428     ASPx.RemoveElement(image);
15429    index++;
15430   }
15431  },
15432  InitializeElementsSize: function () {
15433   var mainElement = this.GetMainElement();
15434   this.defaultControlSize = {
15435    width: mainElement.style.width,
15436    height: mainElement.style.height
15437   };
15438  },
15439  AfterInitialize: function () {
15440   ASPxClientControl.prototype.AfterInitialize.call(this);
15441   this.InitializeHandlers();
15442  },
15443  InitializeHandlers: function () {
15444   if(ASPx.Browser.TouchUI)
15445    return;
15446   if(this.enableKeyboardSupport) {
15447    var element = this.GetMainElement();
15448    ASPx.Evt.AttachEventToElement(element, "keydown", function (evt) { this.OnKeyDown(evt) }.aspxBind(this));
15449    ASPx.Evt.AttachEventToElement(element, "mousedown", function(evt) {
15450     if(!ASPx.Ident.IsFocusableElementRegardlessTabIndex(ASPx.Evt.GetEventSource(evt)))
15451      this.Focus();
15452    }.aspxBind(this));
15453   }
15454   if(this.pausePlayingWhenMouseOver)
15455    MouseEnterHelper.AddHandler(this.GetMainElement(), function () {
15456     if(this.slideShowEnabled)
15457      this.PauseInternal();
15458    }.aspxBind(this), function () {
15459     if(this.slideShowEnabled && !this.stopPlayingWhenPagingExecuted)
15460      this.PlayInternal();
15461    }.aspxBind(this));
15462  },
15463  GetNavigationBarOffset: function(){
15464   var offset = 0;
15465   var navigationBar = this.GetNavigationBarStrategy();
15466   if(navigationBar) 
15467    offset = navigationBar.GetSlideElementPosition();
15468   return isNaN(offset) ? 0 : offset;
15469  },
15470  UpdateStateObject: function(){
15471   this.UpdateStateObjectWithObject({ activeItemIndex: this.GetActiveItemIndex(), navigationBarOffset: this.GetNavigationBarOffset() });
15472  },
15473  CreateTemplates: function () {
15474   var imageArea = this.GetImageAreaStrategy();
15475   if(imageArea)
15476    imageArea.CreateTemplates();
15477   var navigationBar = this.GetNavigationBarStrategy();
15478   if(navigationBar)
15479    navigationBar.CreateTemplates();
15480   ASPx.ProcessScriptsAndLinks(this.name);
15481   this.templateCreated = true;
15482  },
15483  AdjustControlCore: function () {
15484   this.AdjustControlCoreInternal();
15485   if(this.HasTemplates() && !this.templateCreated)
15486    window.setTimeout(function () { this.CreateTemplates(); }.aspxBind(this), 0);
15487  },
15488  SetSizeCore: function(sizePropertyName, size, getFunctionName, corrected) {
15489   this.defaultControlSize[sizePropertyName] = size;
15490   ASPxClientControl.prototype.SetSizeCore.call(this, sizePropertyName, size, getFunctionName, corrected);
15491  },
15492  AdjustControlCoreInternal: function () {
15493   this.AllowRubberLayout();
15494   var mainElementStyle = {
15495    width: SizeUtils.GetClientWidth(this.GetMainElement(), true),
15496    height: SizeUtils.GetClientHeight(this.GetMainElement(), true)
15497   };
15498   var passePartourStyle = {
15499    width: mainElementStyle.width,
15500    height: mainElementStyle.height
15501   };
15502   this.AdjustNavigationBar(mainElementStyle, passePartourStyle);
15503   this.AdjustImageArea(mainElementStyle, passePartourStyle);
15504   this.ensureSizesAreValid(mainElementStyle);
15505   ASPx.SetStyles(this.GetMainElement(), mainElementStyle);
15506   if(this.showImageArea)
15507    ASPx.SetStyles(this.GetPassePartoutElement(), passePartourStyle);
15508   this.DenyRubberLayout();
15509  },
15510  AdjustNavigationBar: function (mainElementStyle, passePartourStyle) {
15511   var navigationBar = this.GetNavigationBarStrategy();
15512   if(navigationBar) {
15513    navigationBar.AdjustControl();
15514    var width = navigationBar.GetWidth();
15515    var height = navigationBar.GetHeight();
15516    if(this.showImageArea) {
15517     switch (this.GetNavigationBarPosition()) {
15518      case NavigationBarPositionEnum.Right:
15519      case NavigationBarPositionEnum.Left:
15520       passePartourStyle.float = "left";
15521       passePartourStyle.width -= width;
15522       break;
15523      case NavigationBarPositionEnum.Bottom:
15524      case NavigationBarPositionEnum.Top:
15525       passePartourStyle.height -= height;
15526       break;
15527     }
15528    }
15529    else {
15530     mainElementStyle.width = width;
15531     mainElementStyle.height = height;
15532    }
15533   }
15534  },
15535  AdjustImageArea: function (mainElementStyle, passePartourStyle) {
15536   var imageAreaStrategy = this.GetImageAreaStrategy();
15537   if(imageAreaStrategy) {
15538    imageAreaStrategy.AdjustControl(passePartourStyle.width, passePartourStyle.height);
15539    var imageAreaWidth = imageAreaStrategy.GetWidth();
15540    var imageAreaHeight = imageAreaStrategy.GetHeight();
15541    var navigationBar = this.GetNavigationBarStrategy();
15542    var navigationBarWidht = navigationBar ? navigationBar.GetWidth() : 0;
15543    var navigationBarHeight = navigationBar ? navigationBar.GetHeight() : 0;
15544    if(imageAreaWidth > passePartourStyle.width) {
15545     passePartourStyle.width = imageAreaWidth;
15546     mainElementStyle.width = imageAreaWidth + navigationBarWidht;
15547    }
15548    if(imageAreaHeight > passePartourStyle.height) {
15549     passePartourStyle.height = imageAreaHeight;
15550     mainElementStyle.height = imageAreaHeight + navigationBarHeight;
15551    }
15552   }
15553  },
15554  AllowRubberLayout: function () {
15555   this.ResetControlStyle();
15556   ASPx.SetStyles(this.GetMainElement(), {
15557    borderSpacing: 0,
15558    overflow: "hidden",
15559    display: "table" 
15560   });
15561   if(this.showImageArea)
15562    ASPx.SetStyles(this.GetPassePartoutElement(), { width: "", height: "" });
15563  },
15564  DenyRubberLayout: function () {
15565   ASPx.SetStyles(this.GetMainElement(), {
15566    display: "",
15567    overflow: "",
15568    borderSpacing: ""
15569   });
15570   if(this.showImageArea)
15571    ASPx.SetStyles(this.GetPassePartoutElement(), { display: "" });
15572  },
15573  ResetControlStyle: function () {
15574   ASPx.SetStyles(this.GetMainElement(), this.defaultControlSize);
15575   var navigationBar = this.GetNavigationBarStrategy();
15576   if(navigationBar)
15577    navigationBar.ResetControlStyle();
15578   var imageAreaStrategy = this.GetImageAreaStrategy();
15579   if(imageAreaStrategy)
15580    imageAreaStrategy.ResetControlStyle();
15581  },
15582  ensureSizesAreValid: function(style) {
15583   if(style.width <= 0)
15584    style.width = 1;
15585   if(style.height <= 0)
15586    style.height = 1;
15587  },
15588  CreateControlHierarchy: function () {
15589   if(this.showImageArea) {
15590    this.passePartoutElement = document.createElement("DIV");
15591    this.GetMainElement().appendChild(this.passePartoutElement);
15592    this.imageAreaStrategy = this.CreateImageAreaStrategy();
15593   }
15594   if(this.showNavBar)
15595    this.navigationBarStrategy = this.CreateNavigationBarStrategy();
15596   this.RaiseStrategiesCreated();
15597  },
15598  CreateImageAreaStrategy: function () {
15599   switch (this.GetAnimationType()) {
15600    case AnimationTypeEnum.Slide:
15601     return this.CreateSlideImageAreaStrategy();
15602     break;
15603    case AnimationTypeEnum.Fade:
15604     return new FadeImageAreaStrategy(this);
15605     break;
15606    case AnimationTypeEnum.None:
15607     return new NoneImageAreaStrategy(this);
15608     break;
15609   }
15610  },
15611  CreateSlideImageAreaStrategy: function () {
15612   return this.enableLoopNavigation ? new SlideLoopNavigationImageAreaStrategy(this) : new SlideImageAreaStrategy(this);
15613  },
15614  CreateNavigationBarStrategy: function () {
15615   switch (this.GetNavigationBarMode()) {
15616    case NavigationBarModeEnum.Thumbnails:
15617     return new NavigationBarThumbnailStrategy(this);
15618     break;
15619    case NavigationBarModeEnum.Dots:
15620     return new NavigationBarDotsStrategy(this);
15621     break;
15622   }
15623  },
15624  PrepareControlHierarchy: function () {
15625   this.PrepareMainElement();
15626   if(this.showImageArea)
15627    this.PreparePassePartoutElement();
15628   if(this.autoPlay)
15629    this.Play();
15630  },
15631  PrepareMainElement: function () {
15632   var mainElement = this.GetMainElement();
15633   mainElement.tabIndex = Math.max(mainElement.tabIndex, 0);
15634   ASPx.SetElementDisplay(mainElement, true);
15635  },
15636  PreparePassePartoutElement: function () {
15637   ASPx.SetStyles(this.GetPassePartoutElement(), {
15638    cssText: this.passePartoutStyle,
15639    className: CssClassesConstants.PassePartoutCssClassName
15640   });
15641  },
15642  OnBrowserWindowResize: function(e) {
15643   this.AdjustControl();
15644  },
15645  OnKeyDown: function(evt) {
15646   if(!this.IsFocused())
15647    return;
15648   var keyKode = ASPx.Evt.GetKeyCode(evt);
15649   switch (keyKode) {
15650    case ASPx.Key.Left:
15651     if(this.rtl) {
15652      this.SetActiveItemIndex(this.GetActiveItemIndex() + 1);
15653      return ASPx.Evt.PreventEvent(evt);
15654     }
15655    case ASPx.Key.Up:
15656     this.SetActiveItemIndex(this.GetActiveItemIndex() - 1);
15657     return ASPx.Evt.PreventEvent(evt);
15658    case ASPx.Key.Right:
15659     if(this.rtl) {
15660      this.SetActiveItemIndex(this.GetActiveItemIndex() - 1);
15661      return ASPx.Evt.PreventEvent(evt);
15662     }
15663    case ASPx.Key.Down:
15664     this.SetActiveItemIndex(this.GetActiveItemIndex() + 1);
15665     return ASPx.Evt.PreventEvent(evt);
15666    case ASPx.Key.Home:
15667     this.SetActiveItemIndex(0);
15668     return ASPx.Evt.PreventEvent(evt);
15669    case ASPx.Key.End:
15670     this.SetActiveItemIndex(this.GetItemCount() - 1);
15671     return ASPx.Evt.PreventEvent(evt);
15672   }
15673  },
15674  GetImageAreaStrategy: function () {
15675   return this.imageAreaStrategy;
15676  },
15677  GetNavigationBarStrategy: function () {
15678   return this.navigationBarStrategy;
15679  },
15680  GetPassePartoutElement: function () {
15681   return this.passePartoutElement;
15682  },
15683  GetItem: function (index) {
15684   var item = this.GetItemInternal(index);
15685   if(item)
15686    return new ASPxClientImageSliderItem(this, index, item.n, item.s, item.t);
15687   return null;
15688  },
15689  GetItemByName: function (name) {
15690   for(var i = 0; i < this.GetItemCount() ; i++)
15691    if(this.GetItemInternal(i).n == name)
15692     return this.GetItem(i);
15693   return null;
15694  },
15695  GetActiveItemIndex: function () {
15696   return this.GetRtlIndex(this.GetActiveItemIndexInternal());
15697  },
15698  SetActiveItemIndex: function (index, preventAnimation, isAPICall) {
15699   this.SetActiveItemIndexInternal(this.GetRtlIndex(index), preventAnimation, isAPICall);
15700  },
15701  GetActiveItem: function () {
15702   return this.GetItem(this.GetActiveItemIndex());
15703  },
15704  SetActiveItem: function (item, preventAnimation) {
15705   this.SetActiveItemIndex(item.index, preventAnimation);
15706  },
15707  GetItemCount: function () {
15708   return this.items.length;
15709  },
15710  Focus: function () {
15711   if(!ASPx.Browser.TouchUI && this.enableKeyboardSupport)
15712    ASPx.SetFocus(this.GetMainElement());
15713  },
15714  Play: function () {
15715   if(this.enabled) {
15716    this.PlayInternal();
15717    this.slideShowEnabled = true;
15718   }
15719  },
15720  Pause: function () {
15721   if(this.enabled) {
15722    this.PauseInternal();
15723    this.slideShowEnabled = false;
15724   }
15725  },
15726  IsSlideShowPlaying: function () {
15727   return this.timerID != -1;
15728  },
15729  IsFocused: function () {
15730   return ASPx.GetActiveElement() == this.GetMainElement();
15731  },
15732  PlayInternal: function () {
15733   if(this.IsSlideShowPlaying())
15734    return;
15735   this.timerID = window.setInterval(function () { this.DoSeActivetNextItem(); }.aspxBind(this), this.interval);
15736   this.stopPlayingWhenPagingExecuted = false;
15737   if(this.GetImageAreaStrategy())
15738    this.GetImageAreaStrategy().SetSlideShowButtonState(false);
15739  },
15740  PauseInternal: function () {
15741   this.timerID = ASPx.Timer.ClearInterval(this.timerID);
15742   if(this.GetImageAreaStrategy())
15743    this.GetImageAreaStrategy().SetSlideShowButtonState(true);
15744  },
15745  ResetSlideShowTimer: function () {
15746   if(this.IsSlideShowPlaying()) {
15747    this.timerID = ASPx.Timer.ClearInterval(this.timerID);
15748    this.timerID = window.setInterval(function () { this.DoSeActivetNextItem(); }.aspxBind(this), this.interval);
15749   }
15750  },
15751  StopPlayingWhenPaging: function () {
15752   if(this.stopPlayingWhenPaging) {
15753    this.Pause();
15754    this.stopPlayingWhenPagingExecuted = true;
15755   }
15756  },
15757  DoSeActivetNextItem: function () {
15758   var activeIndex = this.GetActiveItemIndex() + 1;
15759   if(activeIndex >= this.GetItemCount())
15760    activeIndex = 0;
15761   this.SetActiveItemIndex(activeIndex);
15762  },
15763  RaiseStrategiesCreated: function () {
15764   if(!this.StrategiesCreated.IsEmpty())
15765    this.StrategiesCreated.FireEvent(this, null);
15766  },
15767  RaiseActiveItemChanged: function () {
15768   this.RaiseItemEvent(this.ActiveItemChanged);
15769  },
15770  RaiseItemClick: function () {
15771   this.RaiseItemEvent(this.ItemClick);
15772  },
15773  RaiseThumbnailItemClick: function () {
15774   this.RaiseItemEvent(this.ThumbnailItemClick);
15775  },
15776  RaiseItemEvent: function (event) {
15777   if(!event.IsEmpty()) {
15778    var args = new ASPxClientImageSliderItemEventArgs(this.GetActiveItem());
15779    event.FireEvent(this, args);
15780   }
15781  },
15782  SetActiveItemIndexInternal: function (index, preventAnimation, isAPICall) {
15783   if(index >= 0 && index < this.GetItemCount() && index != this.GetActiveItemIndexInternal()) {
15784    if(this.GetImageAreaStrategy())
15785     this.GetImageAreaStrategy().SetActiveItemIndex(index, preventAnimation);
15786    if(this.GetNavigationBarStrategy())
15787     this.GetNavigationBarStrategy().SetActiveItemIndex(index, preventAnimation);
15788    this.ResetSlideShowTimer();
15789    if(!isAPICall)
15790     this.RaiseActiveItemChanged();
15791   }
15792  },
15793  GetActiveItemIndexInternal: function() {
15794   var strategy = this.GetImageAreaStrategy() || this.GetNavigationBarStrategy();
15795   if(strategy)
15796    return strategy.GetActiveItemIndex();
15797   return 0;
15798  },
15799  GetItemInternal: function (index) {
15800   if(index < 0 || index >= this.GetItemCount())
15801    return null;
15802   return this.items[index];
15803  },
15804  GetRtlIndex: function (index) {
15805   if(this.rtl)
15806    return this.GetItemCount() - 1 - index;
15807   return index;
15808  },
15809  GetAnimationType: function () {
15810   return this.animationType;
15811  },
15812  HasNavigateUrls: function () {
15813   return this.hasNavigateUrls;
15814  },
15815  HasTemplates: function () {
15816   return this.hasTemplates;
15817  },
15818  GetNavigationBarPosition: function () {
15819   return this.navBarPos;
15820  },
15821  GetNavigationBarMode: function () {
15822   return this.dotHCssCl != "" ? 1 : 0;
15823  }
15824 });
15825 ASPxClientImageSlider.Cast = ASPxClientControl.Cast;
15826 var ASPxClientImageSliderItemEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
15827  constructor: function (item) {
15828   this.constructor.prototype.constructor.call(this);
15829   this.item = item;
15830  }
15831 });
15832 var ASPxClientImageSliderItem = ASPx.CreateClass(null, {
15833  constructor: function (imageSlider, index, name, imageUrl, text) {
15834   this.imageSlider = imageSlider;
15835   this.index = index;
15836   this.name = name;
15837   this.imageUrl = imageUrl;
15838   this.text = text;
15839  }
15840 });
15841 var ASPxClientImageZoomNavigator = ASPx.CreateClass(ASPxClientImageSlider, {
15842  constructor: function (name) {
15843   this.constructor.prototype.constructor.call(this, name);
15844   this.disableSelectedStateAnimation = true;
15845   this.imageZoomName = "";
15846   this.changeAction = 0;
15847   this.buttonVisibilityMode = 0;
15848  },
15849  Initialize: function () {
15850   ASPxClientImageSlider.prototype.Initialize.call(this);
15851   this.ActiveItemChanged.AddHandler(function () {
15852    this.OnActiveItemChanged();
15853   }.aspxBind(this));
15854  },
15855  CreateNavigationBarStrategy: function () {
15856   return new ImageZoomNavigationBarStrategy(this);
15857  },
15858  PrepareControlHierarchy: function () {
15859   ASPxClientImageSlider.prototype.PrepareControlHierarchy.call(this);
15860   ASPx.AddClassNameToElement(this.GetMainElement(), CssClassesConstants.ImageZoomNavigatorCssClassName);
15861  },
15862  OnActiveItemChanged: function () {
15863   this.UpdageImageZoomImages();
15864  },
15865  UpdageImageZoomImages: function() {
15866   var imageZoom = this.GetImageZoom();
15867   if(imageZoom) {
15868    var item = this.GetItemInternal(this.GetActiveItemIndex());
15869    imageZoom.SetImageProperties(item.s, item.liu || item.s, item.zt, item.et, item.zt || item.at);
15870   }
15871  },
15872  GetImageZoom: function() {
15873   return this.imageZoomName ? ASPx.GetControlCollection().Get(this.imageZoomName) : null;
15874  }
15875 });
15876 var ImageZoomNavigationBarStrategy = ASPx.CreateClass(NavigationBarThumbnailStrategy, {
15877  constructor: function (imageZoomNavigator) {
15878   this.visibleItemCount = 0;
15879   this.constructor.prototype.constructor.call(this, imageZoomNavigator);
15880  },
15881  InitializeHandlers: function () {
15882   if(this.GetImageSlider().changeAction == ActiveItemChangeActionEnum.Hover) {
15883    ItemsOwnerBase.prototype.InitializeHandlers.call(this);
15884    ASPx.Evt.AttachEventToElement(this.GetSlidePanelElement(), "mouseover", function (evt) { this.OnNavigationBarMouseOver(evt); }.aspxBind(this));
15885   }
15886   else
15887    NavigationBarThumbnailStrategy.prototype.InitializeHandlers.call(this);
15888  },
15889  OnNavigationBarMouseOver: function (evt) {
15890   if(!this.IsExecutedGesture()) {
15891    var index = this.GetItemIndexFromEvent(evt);
15892    if(index != -1)
15893     this.GetImageSlider().SetActiveItemIndexInternal(index);
15894   }
15895  },
15896  GetEnableItemHoverState: function () {
15897   return this.GetImageSlider().changeAction == ActiveItemChangeActionEnum.Click;
15898  },
15899  GetItemAlternateText: function (index) {
15900   if(this.IsValidItemIndex(index)) {
15901    var item = this.GetItem(index);
15902    return item.zt || item.at || "";
15903   }
15904   return "";
15905  },
15906  CalculateSize: function() {
15907   NavigationBarThumbnailStrategy.prototype.CalculateSize.call(this);
15908   if(!this.CanUseVisibleItemCount()) {
15909    var isHorizontal = this.IsHorizontalNavigation();
15910    var size = {
15911     width: isHorizontal ? this.GetItemWidthWithSpacing() * this.GetItemCount() - this.GetItemSpacing() : this.GetItemElementWidth(),
15912     height: isHorizontal ? this.GetItemElementHeight() : this.GetItemHeightWithSpacing() * this.GetItemCount() - this.GetItemSpacing()
15913    };
15914    var mainElementWidth = SizeUtils.GetClientWidth(this.GetMainElement(), true);
15915    var mainElementHeight = SizeUtils.GetClientHeight(this.GetMainElement(), true);
15916    if(isHorizontal && size.width < mainElementWidth || !isHorizontal && size.height < mainElementHeight) {
15917     this.visibleItemCount = this.GetItemCount();
15918     if(this.GetImageSlider().buttonVisibilityMode == NavigationButtonVisibilityModeEnum.Auto)
15919      this.SetVisibilityButtons(false);
15920    }
15921   }
15922  },
15923  UpdateNavigationButtonsState: function () {
15924   if(this.GetVisibleItemCount() != this.GetItemCount() || this.GetImageSlider().buttonVisibilityMode != NavigationButtonVisibilityModeEnum.Auto)
15925    return NavigationBarThumbnailStrategy.prototype.UpdateNavigationButtonsState.call(this);
15926   return false;
15927  },
15928  CanCreateNavigationButtons: function() {
15929   if(this.GetImageSlider().buttonVisibilityMode == NavigationButtonVisibilityModeEnum.Always)
15930    return true;
15931   return NavigationBarThumbnailStrategy.prototype.CanCreateNavigationButtons.call(this);
15932  },
15933  GetVisibleItemCount: function() {
15934   return this.GetImageSlider().visibleItemsCount || this.visibleItemCount;
15935  }
15936 });
15937 window.ASPxClientImageSlider = ASPxClientImageSlider;
15938 window.ASPxClientImageSliderItemEventArgs = ASPxClientImageSliderItemEventArgs;
15939 window.ASPxClientImageSliderItem = ASPxClientImageSliderItem;
15940 window.ASPxClientImageZoomNavigator = ASPxClientImageZoomNavigator;
15941})();

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.