PageSourceSearch

https://wandelroutenetwerk.nl/DXR.axd?r=1_10,1_253,1_21-Rkqku&order=0

js wandelroutenetwerk.nl collected 2026-09-24 10:59:22 UTC 198,725 bytes, 5,362 lines download raw bytes

1ASPx.IS(function(ASPx, dx, DevExpress){
2(function module(ASPx, options) {
3ASPx.modules.Classes = module;
4ASPx.classesScriptParsed = false;
5ASPx.documentLoaded = false; 
6ASPx.CallbackType = {
7 Data: "d",
8 Common: "c"
9};
10ASPx.callbackState = {
11 aborted: "aborted",
12 inTurn: "inTurn",
13 sent: "sent"
14};
15var ASPxClientEvent = ASPx.CreateClass(null, {
16 constructor: function() {
17  this.handlerInfoList = [];
18  this.firingIndex = -1;
19 },
20 AddHandler: function(handler, executionContext) {
21  if(typeof(executionContext) == "undefined")
22   executionContext = null;
23  this.RemoveHandler(handler, executionContext);
24  var handlerInfo = ASPxClientEvent.CreateHandlerInfo(handler, executionContext);
25  this.handlerInfoList.push(handlerInfo);
26 },
27 RemoveHandler: function(handler, executionContext) {
28  this.removeHandlerByCondition(function(handlerInfo) {
29   return handlerInfo.handler == handler && 
30    (!executionContext || handlerInfo.executionContext == executionContext);
31  });
32 },
33 removeHandlerByCondition: function(predicate) {
34   for(var i = this.handlerInfoList.length - 1; i >= 0; i--) {
35   var handlerInfo = this.handlerInfoList[i];
36   if(predicate(handlerInfo)) {
37    ASPx.Data.ArrayRemoveAt(this.handlerInfoList, i);
38    if(i <= this.firingIndex)
39     this.firingIndex--;
40   }
41  }
42 },
43 removeHandlerByControlName: function(controlName) {
44  this.removeHandlerByCondition(function(handlerInfo) {
45   return handlerInfo.executionContext &&  
46    handlerInfo.executionContext.name === controlName;
47  });
48 },
49 ClearHandlers: function() {
50  this.handlerInfoList.length = 0;
51 },
52 FireEvent: function(obj, args) {
53  for(this.firingIndex = 0; this.firingIndex < this.handlerInfoList.length; this.firingIndex++) {
54   var handlerInfo = this.handlerInfoList[this.firingIndex];
55   handlerInfo.handler.call(handlerInfo.executionContext, obj, args);
56  }
57 },
58 InsertFirstHandler: function(handler, executionContext){
59  if(typeof(executionContext) == "undefined")
60   executionContext = null;
61  var handlerInfo = ASPxClientEvent.CreateHandlerInfo(handler, executionContext);
62  ASPx.Data.ArrayInsert(this.handlerInfoList, handlerInfo, 0);
63 },
64 IsEmpty: function() {
65  return this.handlerInfoList.length == 0;
66 }
67});
68ASPxClientEvent.CreateHandlerInfo = function(handler, executionContext) {
69 return {
70  handler: handler,
71  executionContext: executionContext
72 };
73};
74var ASPxClientEventArgs = ASPx.CreateClass(null, {
75 constructor: function() {
76 }
77});
78ASPxClientEventArgs.Empty = new ASPxClientEventArgs();
79var ASPxClientCancelEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
80 constructor: function(){
81  this.constructor.prototype.constructor.call(this);
82  this.cancel = false;
83 }
84});
85var ASPxClientProcessingModeEventArgs = ASPx.CreateClass(ASPxClientEventArgs, {
86 constructor: function(processOnServer){
87  this.constructor.prototype.constructor.call(this);
88  this.processOnServer = !!processOnServer;
89 }
90});
91var ASPxClientProcessingModeCancelEventArgs = ASPx.CreateClass(ASPxClientProcessingModeEventArgs, {
92 constructor: function(processOnServer){
93  this.constructor.prototype.constructor.call(this, processOnServer);
94  this.cancel = false;
95 }
96});
97var OrderedMap = ASPx.CreateClass(null, {
98 constructor: function(){
99  this.entries = {};
100  this.firstEntry = null;
101  this.lastEntry = null;
102 },
103 add: function(key, element) {
104  var entry = this.addEntry(key, element);
105  this.entries[key] = entry;
106 },
107 remove: function(key) {
108  var entry = this.entries[key];
109  if(entry === undefined)
110   return;
111  this.removeEntry(entry);
112  delete this.entries[key];
113 },
114 clear: function() {
115  this.markAllEntriesAsRemoved();
116  this.entries = {};
117  this.firstEntry = null;
118  this.lastEntry = null;
119 },
120 get: function(key) {
121  var entry = this.entries[key];
122  return entry ? entry.value : undefined;
123 },
124 forEachEntry: function(processFunc, context) {
125  context = context || this;
126  for(var entry = this.firstEntry; entry; entry = entry.next) {
127   if(entry.removed)
128    continue;
129   if(processFunc.call(context, entry.key, entry.value))
130    return;
131  }
132 },
133 addEntry: function(key, element) {
134  var entry = { key: key, value: element, next: null, prev: null };
135  if(!this.firstEntry)
136   this.firstEntry = entry;
137  else {
138   entry.prev = this.lastEntry;
139   this.lastEntry.next = entry;
140  }
141  this.lastEntry = entry;
142  return entry;
143 },
144 removeEntry: function(entry) {
145  if(this.firstEntry == entry)
146   this.firstEntry = entry.next;
147  if(this.lastEntry == entry)
148   this.lastEntry = entry.prev;
149  if(entry.prev)
150   entry.prev.next = entry.next;
151  if(entry.next)
152   entry.next.prev = entry.prev;
153  entry.removed = true;
154 },
155 markAllEntriesAsRemoved: function() {
156  for(var entry = this.firstEntry; entry; entry = entry.next)
157   entry.removed = true;
158 }
159});
160var CollectionBase = ASPx.CreateClass(null, {
161 constructor: function(){
162  this.elementsMap = new OrderedMap();
163  this.isASPxClientCollection = true;
164 },
165 Add: function(key, element) {
166  this.elementsMap.add(key, element);
167 },
168 Remove: function(key) {
169  this.elementsMap.remove(key);
170 },
171 Clear: function(){
172  this.elementsMap.clear();
173 },
174 Get: function(key){
175  return this.elementsMap.get(key);
176 }
177});
178(function garbageCollector(ASPx, options) {
179 ASPx.modules.garbageCollector = garbageCollector;
180 var interval = options.GCCheckInterval;
181 window.setInterval(collectObjects, interval);
182 function canCollectObjects() {
183  if (!ASPx.GetControlCollection) return false;
184  var collection = ASPx.GetControlCollection();
185  return collection && !collection.InCallback();
186 }
187 function collectObjects() {
188  if (!canCollectObjects()) return;
189  ASPx.GetControlCollectionCollection().RemoveDisposedControls();
190  if(typeof(ASPx.GetStateController) != "undefined")
191   ASPx.GetStateController().RemoveDisposedItems();
192  if(ASPx.TableScrollHelperCollection)
193   ASPx.TableScrollHelperCollection.RemoveDisposedObjects();
194  if(ASPx.Ident.scripts.ASPxClientRatingControl)
195   ASPxClientRatingControl.RemoveDisposedElementUnderCursor();
196  var postHandler = ASPx.GetPostHandler();
197  if(postHandler)
198   postHandler.RemoveDisposedFormsFromCache();
199 }
200})(ASPx, options);
201var ControlTree = ASPx.CreateClass(null, {
202 constructor: function(controlCollection, container, controlFilter) {
203  this.container = container;
204  this.domMap = { };
205  this.rootNode = this.createNode(null, null);
206  this.createControlTree(controlCollection, container, controlFilter);
207 },
208 createControlTree: function(controlCollection, container, controlFilter) {
209  controlCollection.ProcessControlsInContainer(container, function(control) {
210   control.RegisterInControlTree(this);
211  }.aspxBind(this), controlFilter);
212  var fixedNodes = [];
213  var fixedNodesChildren = [];
214  for(var domElementID in this.domMap) {
215   if(!this.domMap.hasOwnProperty(domElementID)) continue;
216   var node = this.domMap[domElementID];
217   var controlOwner = node.control ? node.control.controlOwner : null;
218   if(controlOwner && this.domMap[controlOwner.name])
219    continue;
220   if(this.isFixedNode(node))
221    fixedNodes.push(node);
222   else {
223    var parentNode = this.findParentNode(domElementID);
224    parentNode = parentNode || this.rootNode;
225    if(this.isFixedNode(parentNode))
226     fixedNodesChildren.push(node);
227    else {
228     var childNode = node.mainNode || node;
229     this.addChildNode(parentNode, childNode);
230    }
231   }
232  }
233  for(var i = fixedNodes.length - 1; i >= 0; i--)
234   this.insertChildNode(this.rootNode, fixedNodes[i], 0);
235  for(var i = fixedNodesChildren.length - 1; i >= 0; i--)
236   this.insertChildNode(this.rootNode, fixedNodesChildren[i], 0);
237 },
238 findParentNode: function(id) {
239  var element = document.getElementById(id).parentNode;
240  while(element && element.tagName !== "BODY") {
241   if(element.id) {
242    var parentNode = this.domMap[element.id];
243    if(parentNode)
244     return parentNode;
245   }
246   element = element.parentNode;
247  }
248  return null;
249 },
250 addChildNode: function(node, childNode) {
251  if(!childNode.parentNode) {
252   node.children.push(childNode);
253   childNode.parentNode = node;
254  }
255 },
256 insertChildNode: function(node, childNode, index) {
257  if(!childNode.parentNode) {
258   ASPx.Data.ArrayInsert(node.children, childNode, index);
259   childNode.parentNode = node;
260  }
261 },
262 addRelatedNode: function(node, relatedNode) {
263  this.addChildNode(node, relatedNode);
264  relatedNode.mainNode = node;
265 },
266 isFixedNode: function(node) {
267  var control = node.mainNode ? node.mainNode.control : node.control;
268  return control && control.HasFixedPosition();
269 },
270 createNode: function(domElementID, control) {
271  var node = {
272   control: control,
273   children: [],
274   parentNode: null,
275   mainNode: null
276  };
277  if(domElementID)
278   this.domMap[domElementID] = node;
279  return node;
280 }
281});
282var ControlAdjuster = ASPx.CreateClass(null, {
283 constructor: function() {
284 },
285 adjustControlsInHierarchy: function(controlCollection, adjustFunc, container, collapseControls, controlFilter) {
286  var controlTree = new ASPx.ControlTree(controlCollection, container, controlFilter);
287  this.adjustControlsInTree(controlTree.rootNode, adjustFunc, container, collapseControls);
288 },
289 adjustControlsInTree: function(treeNode, adjustFunc, container, collapseControls) {
290  var observer = _aspxGetDomObserver();
291  observer.pause(container, true);
292  var documentScrollInfo;
293  if(collapseControls) {
294   documentScrollInfo = ASPx.GetOuterScrollPosition(document.body);
295   this.collapseControls(treeNode);
296  }
297  var adjustNodes = [], 
298   autoHeightNodes = [];
299  var requireReAdjust = this.forEachControlCore(treeNode, collapseControls, adjustFunc, adjustNodes, autoHeightNodes);
300  if(requireReAdjust)
301   this.forEachControlsBackward(adjustNodes, collapseControls, adjustFunc);
302  else {
303   for(var i = 0, node; node = autoHeightNodes[i]; i++)
304    node.control.AdjustAutoHeight();
305  }
306  if(collapseControls)
307   ASPx.RestoreOuterScrollPosition(documentScrollInfo);
308  observer.resume(container, true);
309 },
310 forEachControlCore: function(node, collapseControls, processFunc, adju
310stNodes, autoHeightNodes) {
311  var requireReAdjust = false,
312   size, newSize;
313  if(node.control) {
314   var checkReadjustment = collapseControls && node.control.IsControlCollapsed() && node.control.CanCauseReadjustment();
315   if(checkReadjustment)
316    size = node.control.GetControlPercentMarkerSize(false, true);
317   if(node.control.IsControlCollapsed() && !node.control.IsExpandableByAdjustment())
318    node.control.ExpandControl();
319   node.control.isInsideHierarchyAdjustment = true;
320   processFunc(node.control);
321   node.control.isInsideHierarchyAdjustment = false;
322   if(checkReadjustment) {
323    newSize = node.control.GetControlPercentMarkerSize(false, true);
324    requireReAdjust = size.width !== newSize.width;
325   }
326   if(node.control.sizingConfig.supportAutoHeight)
327    autoHeightNodes.push(node);
328   node.control.ResetControlPercentMarkerSize();
329  }
330  for(var childNode, i = 0; childNode = node.children[i]; i++)
331   requireReAdjust = this.forEachControlCore(childNode, collapseControls, processFunc, adjustNodes, autoHeightNodes) || requireReAdjust;
332  adjustNodes.push(node);
333  return requireReAdjust;
334 },
335 forEachControlsBackward: function(adjustNodes, collapseControls, processFunc) {
336  for(var i = 0, node; node = adjustNodes[i]; i++)
337   this.forEachControlsBackwardCore(node, collapseControls, processFunc);
338 },
339 forEachControlsBackwardCore: function(node, collapseControls, processFunc) {
340  if(node.control)
341   processFunc(node.control);
342  if(node.children.length > 1) {
343   for(var i = 0, childNode; childNode = node.children[i]; i++) {
344    if(childNode.control)
345     processFunc(childNode.control);
346   }
347  }
348 },
349 collapseControls: function(node) {
350  for(var childNode, i = 0; childNode = node.children[i]; i++)
351   this.collapseControls(childNode);
352  if(node.control && node.control.NeedCollapseControl())
353   node.control.CollapseControl();
354 }
355});
356var controlAdjuster = null;
357function GetControlAdjuster() {
358 if(!controlAdjuster)
359  controlAdjuster = new ControlAdjuster();
360 return controlAdjuster;
361}
362function _aspxFunctionIsInCallstack(currentCallee, targetFunction, depthLimit) {
363 var candidate = currentCallee;
364 var depth = 0;
365 while(candidate && depth <= depthLimit) {
366  candidate = candidate.caller;
367  if(candidate == targetFunction)
368   return true;
369  depth++;
370 }
371 return false;
372}
373ASPx.attachToReady(aspxClassesWindowOnLoad);
374function aspxClassesWindowOnLoad(){
375 ASPx.documentLoaded = true;
376 _aspxMoveLinkElements();
377 _aspxSweepDuplicatedLinks();
378 ResourceManager.SynchronizeResources();
379 var externalScriptProcessor = GetExternalScriptProcessor();
380 if(externalScriptProcessor)
381  externalScriptProcessor.ShowErrorMessages();
382 ASPx.AccessibilityUtils.initialize();
383 ASPx.GetControlCollection().Initialize();
384 _aspxInitializeScripts();
385 _aspxInitializeLinks();
386 _aspxInitializeFocus();
387 ASPx.GetControlCollection().FinalizeInitialization();
388}
389Ident = { };
390Ident.IsDate = function(obj) {
391 return obj && (obj.constructor == Date || obj.constructor.name == "Date");
392};
393Ident.IsRegExp = function(obj) {
394 return obj && obj.constructor === RegExp;
395};
396Ident.IsArray = function(obj) {
397 return obj && obj.constructor == Array;
398};
399Ident.IsASPxClientCollection = function(obj) {
400 return obj && obj.isASPxClientCollection;
401};
402Ident.IsASPxClientControl = function(obj) {
403 return obj && obj instanceof ASPxClientControlBase;
404};
405Ident.IsASPxClientEdit = function(obj) {
406 return obj && obj.isASPxClientEdit;
407};
408Ident.IsFocusableElementRegardlessTabIndex = function (element) {
409 var tagName = element.tagName;
410 return tagName == "TEXTAREA" || tagName == "INPUT" || tagName == "A" ||
411  tagName == "SELECT" || tagName == "IFRAME" || tagName == "OBJECT" || tagName == "BUTTON";
412};
413Ident.isDialogInvisibleControl = function(control) {
414 return !!ASPx.Dialog && ASPx.Dialog.isDialogInvisibleControl(control);
415};
416Ident.isBatchEditUnusedEditor = function(control) {
417 return !!ASPx.BatchEditHelper && ASPx.BatchEditHelper.isBatchEditUnusedEditor(control);
418};
419Ident.scripts = {};
420if(ASPx.IsFunction(window.WebForm_InitCallbackAddField)) {
421 (function() {
422  var original = window.WebForm_InitCallbackAddField;
423  window.WebForm_InitCallbackAddField = function(name, value) {
424   if(typeof(name) == "string" && name)
425    original.apply(null, arguments);
426  };
427 })();
428}
429ASPx.FireDefaultButton = function(evt, buttonID) {
430 if(_aspxIsDefaultButtonEvent(evt, buttonID)) {
431  var defaultButton = ASPx.GetElementById(buttonID);
432  if(defaultButton && defaultButton.click) {
433   if(ASPx.IsFocusable(defaultButton))
434    defaultButton.focus();
435   ASPx.Evt.DoElementClick(defaultButton);
436   ASPx.Evt.PreventEventAndBubble(evt);
437   return false;
438  }
439 }
440 return true;
441};
442function _aspxIsDefaultButtonEvent(evt, defaultButtonID) {
443 if(evt.keyCode != ASPx.Key.Enter)
444  return false;
445 var srcElement = ASPx.Evt.GetEventSource(evt);
446 if(!srcElement || srcElement.id === defaultButtonID)
447  return true;
448 var tagName = srcElement.tagName;
449 var type = srcElement.type;
450 return tagName != "TEXTAREA" && tagName != "BUTTON" && tagName != "A" &&
451  (tagName != "INPUT" || type != "checkbox" && type != "radio" && type != "button" && type != "submit" && type != "reset");
452}
453var PostHandler = ASPx.CreateClass(null, {
454 constructor: function() {
455  this.Post = new ASPxClientEvent();
456  this.PostFinalization = new ASPxClientEvent();
457  this.observableForms = [];
458  this.dxCallbackTriggers = {};
459  this.lastSubmitElementName = null;
460  this.beforeOnSubmit = function() { };
461  this.ReplaceGlobalPostFunctions();
462  this.HandleDxCallbackBeginning();
463  this.HandleMSAjaxRequestBeginning();
464 },
465 Update: function() {
466  this.ReplaceFormsSubmit(true);
467 },
468 ProcessPostRequest: function(ownerID, isCallback, isMSAjaxRequest, isDXCallback) {
469  this.cancelPostProcessing = false;
470  this.isMSAjaxRequest = isMSAjaxRequest;
471  if(this.SkipRaiseOnPost(ownerID, isCallback, isDXCallback))
472   return;
473  var args = new PostHandlerOnPostEventArgs(ownerID, isCallback, isMSAjaxRequest, isDXCallback);
474  this.Post.FireEvent(this, args);
475  this.cancelPostProcessing = args.cancel;
476  if(!args.cancel)
477   this.PostFinalization.FireEvent(this, args);
478 },
479 SkipRaiseOnPost: function(ownerID, isCallback, isDXCallback) { 
480  if(!isCallback)
481   return false;
482  var dxOwner = isDXCallback && ASPx.GetControlCollection().GetByName(ownerID);
483  if(dxOwner) {
484   this.dxCallbackTriggers[dxOwner.uniqueID] = true;
485   return false;
486  }
487  if(this.dxCallbackTriggers[ownerID]) {
488   this.dxCallbackTriggers[ownerID] = false;
489   return true;
490  }
491  return false;
492 },
493 ReplaceGlobalPostFunctions: function() {
494  if(ASPx.IsFunction(window.__doPostBack))
495   this.ReplaceDoPostBack();
496  if(ASPx.IsFunction(window.WebForm_DoCallback))
497   this.ReplaceDoCallback();
498  if(ASPx.IsFunction(window.WebForm_ExecuteCallback))
499   this.ReplaceExecuteCallback();
500  this.ReplaceFormsSubmit();
501 },
502 HandleDxCallbackBeginning: function() {
503  ASPx.GetControlCollection().BeforeInitCallback.AddHandler(function(s, e) {
504   aspxRaisePostHandlerOnPost(e.callbackOwnerID, true, false, true); 
505  });
506 },
507 HandleMSAjaxRequestBeginning: function() {
508  var pageRequestManager = ASPx.GetMSAjaxRequestManager();
509  if(pageRequestManager != null && Ident.IsArray(pageRequestManager._onSubmitStatements)) {
510   pageRequestManager._onSubmitStatements.unshift(function() {
511    var postbackSettings = Sys.WebForms.PageRequestManager.getInstance()._postBackSettings;
512    var postHandler = aspxGetPostHandler();
513    aspxRaisePostHandlerOnPost(postbackSettings.asyncTarget, true, true);
514    return !postHandler.cancelPostProcessing;
515   });
516  }
517 },
518 ReplaceDoPostBack: function() {
519  var original = __doPostBack;
520  __doPostBack = function(eventTarget, eventArgument) {
521   var postHandler = aspxGetPostHandler();
522   aspxRaisePostHandlerOnPost(eventTarget);
523   if(postHandler.cancelPostProcessing)
524    return;
525   ASPxClientControl.postHandlingLocked = true;
526   original(eventTarget, eventArgument);
527   delete ASPxClientControl.postHandlingLocked;
528  };
529 },
530 ReplaceDoCallback: function() {
531  var original = WebForm_DoCallback;
532  WebForm_DoCallback = function(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) {
533   var postHandler = aspxGetPostHandler();
534   aspxRaisePostHandlerOnPost(eventTarget, true);
535   if(postHandler.cancelPostProcessing)
536    return;
537   return original(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync);
538  };
539 },
540 ReplaceExecuteCallback: function() {
541  var original = WebForm_ExecuteCallback;
542  var handler = this;
543  WebForm_ExecuteCallback = function(callbackObject) {
544   var isDxCallback = callbackObject && callbackObject.context && ASPx.GetControlCollection().Get(callbackObject.context) !== null;
545   ASPx.callbackProcessed = false;
546   original(callbackObject);
547   if(ASPx.Browser.Firefox && document.getElementById("__EVENTVALIDATION")) {
548    var viewStateField = document.getElementById("__VIEWSTATE");
549    if(viewStateField) {
550     var response = callbackObject.xmlRequest.responseText;
551     var separatorIndex = response.indexOf("|");
552     var validationFieldLength = separatorIndex > 0 ? response.substring(0, separatorIndex) : null;
553     if(ASPx.IsNumber(validationFieldLength))
554      viewStateField.value = viewStateField.value; 
555    }
556   }
557   if(isDxCallback && !ASPx.callbackProcessed) {
558    var request = callbackObject.xmlRequest;
559    if(ASPxClientUtils.IsExists(callbackObject.eventCallback)) {
560     if (handler.HasAppErrorOnCallback(request))
561      callbackObject.eventCallback(handler.GetServerErrorText(), callbackObject.context);
562     else if (handler.HasNetworkErrorOnCallback(request))
563      callbackObject.eventCallback(handler.GetNetworkError(), callbackObject.context);
564    }
565   }
566  };
567 },
568 HasAppErrorOnCallback: function(request) {
569  if(!request) return false;
570  var isServerError = request.status && request.status == 500;
571  var pattern = /<html[^>]*>([\w|\W]*)<\/html>/im;
572  var text = request.responseText;
573  return isServerError && !!text && pattern.test(text);
574 },
575 GetServerErrorText: function() {
576  return "Internal Server Error";
577 },
578 HasNetworkErrorOnCallback: function(request) {
579  if (!request) return false;
580  return request.readyState == 4 && request.status == 0;
581 },
582 GetNetworkError: function() {
583  return new NetworkError();
584 },
585 ReplaceFormsSubmit: function(checkObservableCollection) {
586  for(var i = 0; i < document.forms.length; i++) { 
587   var form = document.forms[i];
588   if(checkObservableCollection && ASPx.Data.ArrayIndexOf(this.observableForms, form) >= 0)
589    continue;
590   if(form.submit)
591    this.ReplaceFormSubmit(form);
592   this.ReplaceFormOnSumbit(form);
593   this.observableForms.push(form);
594  }
595 },
596 ReplaceFormSubmit: function(form) {
597  var originalSubmit = form.submit;
598  form.submit = function() {
599   var postHandler = aspxGetPostHandler();
600   aspxRaisePostHandlerOnPost();
601   if(postHandler.cancelPostProcessing)
602    return false;
603   var callee = arguments.callee;
604   this.submit = originalSubmit;
605   var submitResult = this.submit();
606   this.submit = callee;
607   return submitResult;
608  };
609  form = null;
610 },
611 ReplaceFormOnSumbit: function(form) {
612  var originalSubmit = form.onsubmit;
613  form.onsubmit = function() {
614   var postHandler = aspxGetPostHandler();
615   postHandler.beforeOnSubmit();
616   if(postHandler.isMSAjaxRequest)
617    postHandler.isMsAjaxRequest = false;
618   else
619    aspxRaisePostHandlerOnPost(postHandler.GetLastSubmitElementName());
620   if(postHandler.cancelPostProcessing)
621    return false;
622   return ASPx.IsFunction(originalSubmit)
623    ? originalSubmit.apply(this, arguments)
624    : true;
625  };
626  form = null;
627 },
628 SetBeforeOnSubmit: function(action) {
629  this.beforeOnSubmit = action;
630 },
631 SetLastSubmitElementName: function(elementName) {
632  this.lastSubmitElementName = elementName;
633 },
634 GetLastSubmitElementName: function() {
635  return this.lastSubmitElementName;
636 },
637 RemoveDisposedFormsFromCache: function(){
638  for(var i = 0; this.observableForms && i < this.observableForms.length; i++){
639   var form = this.observableForms[i];
640   if(!ASPx.IsExistsElement(form)){
641    ASPx.Data.ArrayRemove(this.observableForms, form);
642    i--;
643   }
644  }
645 }
646});
647var NetworkError = ASPx.CreateClass(null, {
648 constructor: function () {
649  this.message = "Network Error";
650 }
651});
652function aspxRaisePostHandlerOnPost(ownerID, isCallback, isMSAjaxRequest, isDXCallback) {
653 if(ASPxClientControl.postHandlingLocked) return;
654 var postHandler = aspxGetPostHandler();
655 if(postHandler)
656  postHandler.ProcessPostRequest(ownerID, isCallback, isMSAjaxRequest, isDXCallback);
657}
658var aspxPostHandler;
659function aspxGetPostHandler() {
660 if(!aspxPostHandler)
661  aspxPostHandler = new PostHandler();
662 return aspxPostHandler;
663}
664var PostHandlerOnPostEventArgs = ASPx.CreateClass(ASPxClientCancelEventArgs, {
665 constructor: function(ownerID, isCallback, isMSAjaxCallback, isDXCallback){
666  this.constructor.prototype.constructor.call(this);
667  this.ownerID = ownerID;
668  this.isCallback = !!isCallback;
669  this.isDXCallback = !!isDXCallback;
670  this.isMSAjaxCallback = !!isMSAjaxCallback;
671 }
672});
673var ResourceManager = {
674 HandlerStr: "DXR.axd?r=",
675 ResourceHashes: {},
676 SynchronizeResources: function(method){
677  if(!method){
678   method = function(name, resource) { 
679    this.UpdateInputElements(name, resource); 
680   }.aspxBind(this);
681  }
682  var resources = this.GetResourcesData();
683  for(var name in resources)
684   if(resources.hasOwnProperty(name))
685    method(name, resources[name]);
686 },
687 GetResourcesData: function(){
688  return {
689   DXScript: this.GetResourcesElementsString(_aspxGetIncludeScripts(), "src", "DXScript"),
690   DXCss: this.GetResourcesElementsString(_aspxGetLinks(), "href", "DXCss")
691  };
692 },
693 ParseBundleSrc: function(elements, urlAttr){
694  var timeStamp = "";
695  var resourceUrlArray = [];
696  for(var i = 0; i < elements.length; i++) {
697   var resourceUrl = ASPx.Attr.GetAttribute(elements[i], urlAttr);
698   if(resourceUrl) {
699    var pos = resourceUrl.indexOf(this.HandlerStr);
700    if(pos > -1){
701     var list = resourceUrl.substr(pos + this.HandlerStr.length);
702     var ampPos = list.lastIndexOf("-");
703     if(ampPos > -1) {
704      timeStamp = list.substr(ampPos);
705      list = list.substr(0, ampPos);
706     }
707     var indexes = list.split(",");
708     for(var j = 0; j < indexes.length; j++) {
709      resourceUrlArray.push(indexes[j]);
710     }
711    }
712    else
713     resourceUrlArray.push(resourceUrl);
714   }
715  }
716  return {
717   'resourceUrlArray': resourceUrlArray,
718   'timeStamp': timeStamp
719  };
720 },
721 GetResourceHashes: function (id) {
722  if (!this.ResourceHashes[id])
723   this.ResourceHashes[id] = {};
724  return this.ResourceHashes[id];
725 },
726 GetResourcesElementsString: function (elements, urlAttr, id) {
727  var hash = this.GetResourceHashes(id);
728  var resourceUrlArray = this.ParseBundleSrc(elements, urlAttr).resourceUrlArray;
729  for(var i = 0; i < resourceUrlArray.length; i++) {
730   hash[resourceUrlArray[i]] = resourceUrlArray[i];
731  }
732  var array = [];
733  for(var key in hash)
734   if(hash.hasOwnProperty(key))
735    array.push(key);
736  return array.join(",");
737 },
738 GetNewResourcesElementString: function (element, urlAttr, id) {
739  var originalUrl = ASPx.Attr.GetAttribute(element, urlAttr);
740  var handlerStrIndex = originalUrl.indexOf(this.HandlerStr);
741  var dxResources = handlerStrIndex > -1;
742  if(!dxResources) return element[urlAttr];
743  var hash = this.GetResourceHashes(id);
744  var srcInfo = this.ParseBundleSrc([element], urlAttr);
745  var resourceUrlArray = srcInfo.resourceUrlArray;
746  var timeStamp = srcInfo.timeStamp;
747  var newResourceArray = [];
748  for(var i = 0; i < resourceUrlArray.length; i++) {
749    if(!hash[resourceUrlArray[i]])
750    newResourceArray.push(resourceUrlArray[i]);
751  }
752  var newResources = "";
753  if(newResourceArray.length > 0) {
754   var baseUrl = originalUrl.substr(0, handlerStrIndex);
755   newResources = baseUrl + this.HandlerStr + newResourceArray.join(",") + timeStamp;
756  }
757  return newResources;
758 },
759 UpdateInputElements: function(typeName, list){
760  for(var i = 0; i < document.forms.length; i++){
761   var inputElement = document.forms[i][typeName];
762   if(!inputElement)
763    inputElement = this.CreateInputElement(document.forms[i], typeName);
764   inputElement.value = list;
765  }
766 },
767 CreateInputElement: function(form, typeName){
768  var inputElement = ASPx.CreateHiddenField(typeName);
769  form.appendChild(inputElement);
770  return inputElement;
771 }
772};
773ASPx.includeScriptPrefix = "dxis_";
774ASPx.startupScriptPrefix = "dxss_";
775var includeScriptsCache = {};
776var createdIncludeScripts = [];
777var appendedScriptsCount = 0;
778var callbackOwnerNames = [];
779var scriptsRestartHandlers = { };
780function _aspxIsKnownIncludeScript(script) {
781 return !!includeScriptsCache[script.src];
782}
783function _aspxCacheIncludeScript(script) {
784 includeScriptsCache[script.src] = 1;
785}
786function _aspxProcessScriptsAndLinks(ownerName, isCallback) {
787 if(!ASPx.documentLoaded) return; 
788 _aspxProcessScripts(ownerName, isCallback);
789 getLinkProcessor().process();
790 ASPx.ClearCachedCssRules();
791}
792function _aspxGetStartupScripts(container) {
793 return _aspxGetScriptsCore(ASPx.startupScriptPrefix, container);
794}
795function _aspxGetIncludeScripts() {
796 return _aspxGetScriptsCore(ASPx.includeScriptPrefix);
797}
798function _aspxGetScriptsCore(prefix, container) {
799 var result = [];
800 var scripts;
801 if(ASPx.IsExists(container))
802  scripts = ASPx.GetNodesByTagName(container, "SCRIPT");
803 else
804  scripts = document.getElementsByTagName("SCRIPT");
805 for(var i = 0; i < scripts.length; i++) {
806  if(scripts[i].id.indexOf(prefix) == 0)
807   result.push(scripts[i]);
808 }
809 return result;
810}
811function _aspxIsResourceLink(link) {
812 if(typeof link !== "string")
813  link = link.href;
814 return link.toLowerCase().indexOf(ResourceManager.HandlerStr.toLowerCase()) >= 0;
815}
816function _aspxGetLinks(allLinks) {
817 var result = [];
818 var links = document.getElementsByTagName("LINK");
819 for(var i = 0; i < links.length; i++) {
820  if(allLinks || _aspxIsResourceLink(links[i]))
821   result.push(links[i]);
822 }
823 return result;
824}
825function _aspxIsLinksLoaded() {
826 var links = _aspxGetLinks(true);
827 for(var i = 0, link; link = links[i]; i++)
828  if(link.readyState && link.readyState.toLowerCase() == "loading")
829    return false;
830 return true;
831}
832function _aspxInitializeLinks() {
833 var links = _aspxGetLinks(true);
834 for(var i = 0; i < links.length; i++)
835  links[i].loaded = true; 
836}
837var scriptExecutedAttrName = "data-executed";
838var scriptDelayedExecutionAttrName = "data-dx-delayedeval";
839ASPx.MarkInnerScriptBlocksAsDelayedExecution = function(scriptsContainer) {
840 var scripts = scriptsContainer.querySelectorAll("script[id^=" + ASPx.startupScriptPrefix + "]");
841 for(var i = 0; i < scripts.length; i++)
842  ASPx.Attr.SetAttribute(scripts[i], scriptDelayedExecutionAttrName, true);
843};
844function isScriptExecuted(script) {
845 return ASPx.Attr.GetAttribute(script, scriptExecutedAttrName);
846}
847function markScriptAsExecuted(script) {
848 if(ASPx.Attr.GetAttribute(script, scriptDelayedExecutionAttrName))
849  ASPx.Attr.RemoveAttribute(script, scriptDelayedExecutionAttrName);
850 else
851  ASPx.Attr.SetAttribute(script, scriptExecutedAttrName, true);
852}
853function _aspxInitializeScripts() {
854 var scripts = _aspxGetIncludeScripts();
855 for(var i = 0; i < scripts.length; i++)
856  _aspxCacheIncludeScript(scripts[i]);   
857 var startupScripts = _aspxGetStartupScripts();
858 for(var i = 0; i < startupScripts.length; i++)
859  markScriptAsExecuted(startupScripts[i]);
860}
861function _aspxSweepDuplicatedLinks() {
862 var hash = { };
863 var links = _aspxGetLinks();
864 for(var i = 0; i < links.length; i++) {
865  var href = links[i].href;
866  if(!href)
867   continue;
868  if(hash[href]){
869   if(!hash[href].loaded && links[i].loaded) {
870    ASPx.RemoveElement(hash[href]);
871    hash[href] = links[i];
872   }
873   else
874    ASPx.RemoveElement(links[i]);
875  }
876  else
877   hash[href] = links[i];
878 }
879}
880function _aspxSweepDuplicatedScripts() {
881 var hash = { };
882 var scripts = _aspxGetIncludeScripts();
883 for(var i = 0; i < scripts.length; i++) {
884  var src = scripts[i].src;
885  if(!src) continue;
886  if(hash[src])
887   ASPx.RemoveElement(scripts[i]);
888  else
889   hash[src] = scripts[i];
890 }
891}
892function _aspxAreScriptsEqual(script1, script2) {
893 return script1.src == script2.src;
894}
895function _aspxProcessScripts(ownerName, isCallback) {
896 var scripts = _aspxGetIncludeScripts();
897 var previousCreatedScript = null;
898 var firstCreatedScript = null;
899 for(var i = 0; i < scripts.length; i++) {
900  var script = scripts[i];
901  if(script.src == "") continue; 
902  if(_aspxIsKnownIncludeScript(script))
903   continue;
904  var getOnlyNewResources = true;
905  var onlyNewScripts = ResourceManager.GetNewResourcesElementString(script, "src", "DXScript", getOnlyNewResources);
906  if (onlyNewScripts == "")
907   continue;
908  var createdScript = document.createElement("script");
909  ASPx.Attr.AppendScriptType(createdScript);
910  createdScript.src = onlyNewScripts;
911  createdScript.id = script.id;
912  if(ASPx.Data.ArrayIndexOf(createdIncludeScripts, createdScript, _aspxAreScriptsEqual) >= 0)
913   continue;
914  createdIncludeScripts.push(createdScript);
915  ASPx.RemoveElement(script);
916  if(ASPx.Browser.Edge || ASPx.Browser.WebKitFamily || (ASPx.Browser.Firefox && ASPx.Browser.Version >= 4) || ASPx.Browser.IE) {
917   createdScript.onload = new Function("ASPx.OnScriptLoadCallback(this, " + isCallback + ");");
918   if(firstCreatedScript == null)
919    firstCreatedScript = createdScript;
920   createdScript.nextCreatedScript = null;
921   if(previousCreatedScript != null)
922    previousCreatedScript.nextCreatedScript = createdScript;
923   previousCreatedScript = createdScript;
924  } else {
925   createdScript.onload = new Function("ASPx.OnScriptLoadCallback(this);");
926   ASPx.AppendScript(createdScript);
927   _aspxCacheIncludeScript(createdScript);
928  }
929 }
930 if(firstCreatedScript != null) {
931  ASPx.AppendScript(firstCreatedScript);
932  _aspxCacheIncludeScript(firstCreatedScript);
933 }
934 if(isCallback)
935  callbackOwnerNames.push(ownerName);
936 if(createdIncludeScripts.length == 0) {
937  var newLinks = ASPx.GetNodesByTagName(document.body, "link");
938  var needProcessLinks = isCallback && newLinks.length > 0;
939  if(needProcessLinks)
940   needProcessLinks = getLinkProcessor().addLinks(newLinks);
941  if(!needProcessLinks)
942   ASPx.FinalizeScriptProcessing(isCallback);
943 }
944}
945ASPx.FinalizeScriptProcessing = function(isCallback) {
946 createdIncludeScripts = [];
947 appendedScriptsCount = 0;
948 var linkProcessor = getLinkProcessor();
949 if(linkProcessor.hasLinks())
950  _aspxSweepDuplicatedLinks();
951 linkProcessor.reset();
952 _aspxSweepDuplicatedScripts();
953 ResourceManager.SynchronizeResources();
954 _aspxRunStartupScripts(isCallback);
955};
956var startupScriptsRunning = false;
957function _aspxRunStartupScripts(isCallback, container) {
958 startupScriptsRunning = true;
959 try {
960  _aspxRunStartupScriptsCore(container);
961 }
962 finally {
963  startupScriptsRunning = false;
964 }
965 if(ASPx.documentLoaded) {
966  ASPx.GetControlCollection().ProcessActionByPredicate(
967   function(collection) { collection.InitializeElements(isCallback); },
968   function(control) { return !ASPx.IsExists(container) || ASPx.GetIsParent(container, control.GetMainElement()); }
969  );
970  for(var key in scriptsRestartHandlers)
971   if(scriptsRestartHandlers.hasOwnProperty(key))
972    scriptsRestartHandlers[key]();
973  if(isCallback)
974   _aspxRunEndCallbackScript();
975 }
976}
977function _aspxIsStartupScriptsRunning(isCallback) {
978 return startupScriptsRunning;
979}
980function _aspxRunStartupScriptsCore(container) {
981 var scripts = _aspxGetStartupScripts(container);
982 var code;
983 for(var i = 0; i < scripts.length; i++){
984  var script = scripts[i];
985  if(!isScriptExecuted(script)) {
986   _aspxEnsureStartupScriptIsUnique(script.id); 
987   code = ASPx.GetScriptCode(script);
988   eval(code);
989   markScriptAsExecuted(script);
990  }
991 }
992}
993function _aspxEnsureStartupScriptIsUnique(scriptId) {
994 if(!scriptId)
995  return;
996 var scriptExecutedSelector = "script[" + scriptExecutedAttrName + "='true']#" + scriptId;
997 ASPx.RemoveElement(document.querySelector(scriptExecutedSelector));
998}
999function _aspxRunEndCallbackScript() {
1000 while(callbackOwnerNames.length > 0) {
1001  var callbackOwnerName = callbackOwnerNames.pop();
1002  var callbackOwner = ASPx.GetControlCollection().Get(callbackOwnerName);
1003  if(callbackOwner)
1004   callbackOwner.DoEndCallback();
1005 }
1006}
1007ASPx.RunStartupScriptsCreatedOnClient = function(container) {
1008 _aspxRunStartupScriptsCore(container);
1009};
1010ASPx.OnScriptReadyStateChangedCallback = function(scriptElement, isCallback) {
1011 if(scriptElement.readyState == "loaded") {
1012  _aspxCacheIncludeScript(scriptElement);
1013  for(var i = 0; i < createdIncludeScripts.length; i++) {
1014   var script = createdIncludeScripts[i];
1015   if(_aspxIsKnownIncludeScript(script)) {
1016    if(!isScriptExecuted(script)) {
1017     markScriptAsExecuted(script);
1018     ASPx.AppendScript(script);
1019     appendedScriptsCount++;
1020    }
1021   } else
1022    break;
1023  }
1024  if(createdIncludeScripts.length == appendedScriptsCount)
1025   ASPx.FinalizeScriptProcessing(isCallback);
1026 }
1027};
1028ASPx.OnScriptLoadCallback = function(scriptElement, isCallback) {
1029 appendedScriptsCount++;
1030 if(scriptElement.nextCreatedScript) {
1031  ASPx.AppendScript(scriptElement.nextCreatedScript);
1032  _aspxCacheIncludeScript(scriptElement.nextCreatedScript);
1033 }
1034 if(createdIncludeScripts.length == appendedScriptsCount)
1035  ASPx.FinalizeScriptProcessing(isCallback);
1036};
1037function _aspxAddScriptsRestartHandler(objectName, handler) {
1038 scriptsRestartHandlers[objectName] = handler;
1039}
1040function _aspxMoveLinkElements() {
1041 var head = ASPx.GetNodesByTagName(document, "head")[0];
1042 var bodyLinks = ASPx.GetNodesByTagName(document.body, "link");
1043 if(head && bodyLinks.length > 0){
1044  var headLinks = ASPx.GetNodesByTagName(head, "link");
1045  var dxLinkAnchor = head.firstChild;
1046  for(var i = 0; i < headLinks.length; i++){
1047   if(_aspxIsResourceLink(headLinks[i]))
1048    dxLinkAnchor = headLinks[i].nextSibling;
1049  }
1050  while(bodyLinks.length > 0) 
1051   head.insertBefore(bodyLinks[0], dxLinkAnchor);
1052 }
1053}
1054var LinkProcessor = ASPx.CreateClass(null, {
1055 constructor: function() {
1056  this.linkInfos = [];
1057  this.loadingObservationTimerID = -1;
1058 },
1059 process: function() {
1060  if(this.hasLinks()) {
1061   if(this.isLinkLoadEventSupported())
1062    this.processViaLoadEvent();
1063   else
1064    this.processViaTimer();
1065  }
1066  else
1067   _aspxSweepDuplicatedLinks();
1068  _aspxMoveLinkElements();
1069 },
1070 addLinks: function(links) {
1071  var prevLinkCount = this.linkInfos.length;
1072  for(var i = 0; i < links.length; i++) {
1073   var link = links[i];
1074   if(link.loaded || link.rel != "stylesheet" || !_aspxIsResourceLink(link))
1075    continue;
1076   var linkInfo = {
1077    link: link,
1078    href: link.href
1079   };
1080   this.linkInfos.push(linkInfo);
1081  }
1082  return prevLinkCount != this.linkInfos.length;
1083 },
1084 hasLinks: function() {
1085  return this.linkInfos.length > 0;
1086 },
1087 reset: function() {
1088  this.linkInfos = [];
1089 },
1090 processViaLoadEvent: function() {
1091  for(var i = 0, linkInfo; linkInfo = this.linkInfos[i]; i++)
1092   linkInfo.link.onload = this.onLinkLoad.bind(this);
1093 },
1094 isLinkLoadEventSupported: function() {
1095  return !(ASPx.Browser.Chrome && ASPx.Browser.MajorVersion < 19 || ASPx.Browser.Firefox && ASPx.Browser.MajorVersion < 9 ||
1096   ASPx.Browser.Safari && ASPx.Browser.MajorVersion < 6 || ASPx.Browser.AndroidDefaultBrowser && ASPx.Browser.MajorVersion < 4.4);
1097 },
1098 processViaTimer: function() {
1099  if(this.loadingObservationTimerID == -1)
1100   this.onLinksLoadingObserve();
1101 },
1102 onLinksLoadingObserve: function() {
1103  if(this.getIsAllLinksLoaded()) {
1104   this.loadingObservationTimerID = -1;
1105   this.onAllLinksLoad();
1106  }
1107  else
1108   this.loadingObservationTimerID = window.setTimeout(this.onLinksLoadingObserve.aspxBind(this), 100);
1109 },
1110 getIsAllLinksLoaded: function() {
1111  var styleSheets = document.styleSheets;
1112  var loadedLinkHrefs = { };
1113  for(var i = 0; i < styleSheets.length; i++) {
1114   var styleSheet = styleSheets[i];
1115   try {
1116    if(styleSheet.cssRules)
1117     loadedLinkHrefs[styleSheet.href] = 1;
1118   }
1119   catch(ex) { }
1120  }
1121  var loadedLinksCount = 0;
1122  for(var i = 0, linkInfo; linkInfo = this.linkInfos[i]; i++) {
1123   if(loadedLinkHrefs[linkInfo.href])
1124    loadedLinksCount++;
1125  }
1126  return loadedLinksCount == this.linkInfos.length;
1127 },
1128 onAllLinksLoad: function() {
1129  this.reset();
1130  _aspxSweepDuplicatedLinks();
1131  if(createdIncludeScripts.length == 0)
1132   ASPx.FinalizeScriptProcessing(true);
1133 },
1134 onLinkReadyStateChanged: function(linkElement) {
1135  if(linkElement.readyState == "complete")
1136   this.onLinkLoadCore(linkElement);
1137 },
1138 onLinkLoad: function(evt) {
1139  var linkElement = ASPx.Evt.GetEventSource(evt);
1140  this.onLinkLoadCore(linkElement);
1141 },
1142 onLinkLoadCore: function(linkElement) {
1143  var linkInfo = this.getLinkInfo(linkElement);
1144  if(!linkInfo) return;
1145  linkInfo.loaded = true;
1146  var notLoadedLinks = this.linkInfos.filter(function(info) { return !info.loaded; });
1147  if(notLoadedLinks.length == 0)
1148   this.onAllLinksLoad();
1149 },
1150 getLinkInfo: function(linkElement) {
1151  for(var i = 0, linkInfo; linkInfo = this.linkInfos[i]; i++) {
1152   if(linkInfo.link == linkElement)
1153    return linkInfo;
1154  }
1155 }
1156});
1157var linkProcessor = null;
1158function getLinkProcessor() {
1159 if(linkProcessor == null)
1160  linkProcessor = new LinkProcessor();
1161 return linkProcessor;
1162}
1163ASPx.LinkProcessor = LinkProcessor;
1164var IFrameHelper = ASPx.CreateClass(null, {
1165 constructor: function(params) {
1166  this.params = params || {};
1167  this.params.src = this.params.src || "";
1168  this.CreateElements();
1169 },
1170 CreateElements: function() {
1171  var elements = IFrameHelper.Create(this.params);
1172  this.containerElement = elements.container;
1173  this.iframeElement = elements.iframe;
1174  this.AttachOnLoadHandler(this, this.iframeElement);
1175  this.SetLoading(true);
1176  if(this.params.onCreate)
1177   this.params.onCreate(this.containerElement, this.iframeElement);
1178 },
1179 AttachOnLoadHandler: function(instance, element) {
1180  ASPx.Evt.AttachEventToElement(element, "load", function() {
1181   instance.OnLoad(element);
1182  });
1183 },
1184 OnLoad: function(element) {
1185  this.SetLoading(false, element);
1186  if(!element.preventCustomOnLoad && this.params.onLoad)
1187   this.params.onLoad();
1188 },
1189 IsLoading: function(element) {
1190  element = element || this.iframeElement;
1191  if(element)
1192   return element.loading;
1193  return false;
1194 },
1195 SetLoading: function(value, element) {
1196  element = element || this.iframeElement;
1197  if(element)
1198   element.loading = value;
1199 },
1200 GetContentUrl: function() {
1201  return this.params.src;
1202 },
1203 SetContentUrl: function(url, preventBrowserCaching) {
1204  if(url) {
1205   this.params.src = url;
1206   if(preventBrowserCaching)
1207    url = IFrameHelper.AddRandomParamToUrl(url);
1208   this.SetLoading(true);
1209   this.iframeElement.src = url;
1210  }
1211 },
1212 RefreshContentUrl: function() {
1213  if(this.IsLoading())
1214   return;
1215  this.SetLoading(true);
1216  var oldContainerElement = this.containerElement;
1217  var oldIframeElement = this.iframeElement;
1218  var postfix = "_del" + Math.floor(Math.random()*100000).toString();
1219  if(this.params.id)
1220   oldIframeElement.id = this.params.id + postfix;
1221  if(this.params.name)
1222   oldIframeElement.name = this.params.name + postfix;
1223  ASPx.SetStyles(oldContainerElement, { height: 0 });
1224  this.CreateElements();
1225  oldIframeElement.preventCustomOnLoad = true;
1226  oldIframeElement.src = ASPx.BlankUrl;
1227  window.setTimeout(function() {
1228   oldContainerElement.parentNode.removeChild(oldContainerElement);
1229  }, 10000); 
1230 }
1231});
1232IFrameHelper.Create = function(params) {
1233 var iframeHtmlStringParts = [ "<iframe frameborder='0'" ];
1234 if(params) {
1235  if(params.id)
1236   iframeHtmlStringParts.push(" id='", params.id, "'");
1237  if(params.name)
1238   iframeHtmlStringParts.push(" name='", params.name, "'");
1239  if(params.title)
1240   iframeHtmlStringParts.push(" title='", params.title, "'");
1241  if(params.scrolling)
1242   iframeHtmlStringParts.push(" scrolling='", params.scrolling, "'");
1243  if(params.src)
1244   iframeHtmlStringParts.push(" src='", params.src, "'");
1245 }
1246 iframeHtmlStringParts.push("></iframe>");
1247 var containerElement = ASPx.CreateHtmlElementFromString("<div style='border-width: 0px; padding: 0px; margin: 0px'></div>");
1248 var iframeElement = ASPx.CreateHtmlElementFromString(iframeHtmlStringParts.join(""));
1249 containerElement.appendChild(iframeElement);
1250 return {
1251  container: containerElement,
1252  iframe: iframeElement
1253 };
1254};
1255IFrameHelper.AddRandomParamToUrl = function(url) {
1256 var prefix = url.indexOf("?") > -1
1257  ? "&"
1258  : "?";
1259 var param = prefix + Math.floor(Math.random()*100000).toString();
1260 var anchorIndex = url.indexOf("#");
1261 return anchorIndex == -1
1262  ? url + param
1263  : url.substr(0, anchorIndex) + param + url.substr(anchorIndex);
1264};
1265IFrameHelper.GetWindow = function(name) {
1266 var frameElement = document.getElementById(name);
1267 return (frameElement != null) ? frameElement.contentWindow : null;
1268};
1269IFrameHelper.GetDocument = function(name) {
1270 var frameElement = document.getElementById(name);
1271 return (frameElement != null) ? frameElement.contentDocument : null;
1272};
1273IFrameHelper.GetDocumentBody = function(name) {
1274 var doc = IFrameHelper.GetDocument(name);
1275 return (doc != null) ? doc.body : null;
1276};
1277IFrameHelper.GetDocumentHead = function (name) {
1278 var doc = IFrameHelper.GetDocument(name);
1279 return (doc != null) ? doc.head || doc.getElementsByTagName('head')[0] : null;
1280};
1281IFrameHelper.GetElement = function(name) {
1282 return document.getElementById(name);
1283};
1284var KbdHelper = ASPx.CreateClass(null, {
1285 constructor: function(control) {
1286  this.control = control;
1287  this.ready = false;
1288  this.clickHandler = this.HandleClick.bind(this);
1289  this.focusHandler = this.onElementFocus.bind(this);
1290  this.blurHandler = this.onBlur.bind(this);
1291 },
1292 Init: function() {
1293  if(!this.ready){
1294   KbdHelper.GlobalInit();
1295   var elements = this.getFocusableElements();
1296   for(var i = 0; i < elements.length; i++) {
1297    var element = elements[i];
1298    element.tabIndex = Math.max(element.tabIndex, 0);
1299    ASPx.Evt.AttachEventToElement(element, "click", this.clickHandler);
1300    ASPx.Evt.AttachEventToElement(element, "focus", this.focusHandler);
1301    ASPx.Evt.AttachEventToElement(element, "blur", this.blurHandler);
1302   }
1303   this.ready = true;
1304  }
1305 },
1306 Dispose: function() {
1307  if(this.ready) {
1308   var elements = this.getFocusableElements();
1309   for(var i = 0; i < elements.length; i++) {
1310    var element = elements[i];
1311    element.tabIndex = -1;
1312    ASPx.Evt.DetachEventFromElement(element, "click", this.clickHandler);
1313    ASPx.Evt.DetachEventFromElement(element, "focus", this.focusHandler);
1314    ASPx.Evt.DetachEventFromElement(element, "blur", this.blurHandler);
1315   }
1316   this.ready = false;
1317  }
1318 },
1319 onElementFocus: function(e) {
1320  if(!this.CanFocus(e))
1321   return true;
1322  KbdHelper.active = this;
1323 },
1324 getFocusableElements: function() {
1325  return [this.GetFocusableElement()]; 
1326 },
1327 GetFocusableElement: function() { return this.control.GetMainElement(); },
1328 canHandleNoFocusAction: function() { 
1329  var focusableElements = this.getFocusableElements();
1330  for(var i = 0; i < focusableElements.length; i++) {
1331   if(focusableElements[i] === _aspxGetFocusedElement())
1332    return false;
1333  }
1334  return true;
1335 },
1336 RequirePreventScrollOnFocus: function() { return false; },
1337 CanFocus: function(e) {
1338  var tag = ASPx.Evt.GetEventSource(e).tagName;
1339  return !(tag === "A" || tag === "TEXTAREA" || tag === "INPUT" || tag === "SELECT" || tag === "IFRAME" || tag === "OBJECT");
1340 },
1341 HandleClick: function(e) {
1342  if(!this.CanFocus(e))
1343   return;
1344  this.Focus();
1345 },
1346 Focus: function() {
1347  var preventScroll = this.RequirePreventScrollOnFocus();
1348  var savedDocumentScrollTop = preventScroll ? ASPx.GetDocumentScrollTop() : -1;
1349  try {
1350   this.GetFocusableElement().focus({ preventScroll: preventScroll });
1351  } catch(e) { }
1352  if(preventScroll && !this.IsNativePreventScrollOnFocusSupported() && savedDocumentScrollTop !== ASPx.GetDocumentScrollTop())
1353   ASPx.SetDocumentScrollTop(savedDocumentScrollTop);
1354 },
1355 IsNativePreventScrollOnFocusSupported: function() {
1356  if(this.isNativePreventScrollOnFocusSupported === undefined)
1357   this.isNativePreventScrollOnFocusSupported = this.CalcIsNativePreventScrollOnFocusSupported();
1358  return this.isNativePreventScrollOnFocusSupported;
1359 },
1360 CalcIsNativePreventScrollOnFocusSupported: function() {
1361  var result = false;
1362  try {
1363   ASPx.GetActiveElement().focus(Object.defineProperty({}, "preventScroll", { get: function() { result = true; } }));
1364  } catch(e) { result = false; }
1365  return result;
1366 },
1367 onBlur: function(){
1368  delete KbdHelper.active;
1369 },
1370 HandleKeyDown: function(e) { }, 
1371 HandleKeyPress: function(e) { }, 
1372 HandleKeyUp: function (e) { },
1373 HandleNoFocusAction: function(e) { },
1374 FocusByAccessKey: function () { }
1375});
1376KbdHelper.GlobalInit = function() {
1377 if(KbdHelper.ready)
1378  return;
1379 ASPx.Evt.AttachEventToDocument("keydown", KbdHelper.OnKeyDown);
1380 ASPx.Evt.AttachEventToDocument("keypress", KbdHelper.OnKeyPress);
1381 ASPx.Evt.AttachEventToDocument("keyup", KbdHelper.OnKeyUp);
1382 KbdHelper.ready = true; 
1383};
1384KbdHelper.swallowKey = false;
1385KbdHelper.accessKeys = { };
1386KbdHelper.ProcessKey = function(e, actionName) {
1387 if(!KbdHelper.active) 
1388  return;
1389 if (KbdHelper.active.canHandleNoFocusAction()) {
1390  KbdHelper.active["HandleNoFocusAction"](e, actionName);
1391  return;
1392 }
1393 var ctl = KbdHelper.active.control;
1394 if(ctl !== ASPx.GetControlCollection().Get(ctl.name)) {
1395  delete KbdHelper.active;
1396  return;
1397 }
1398 if(!KbdHelper.swallowKey) 
1399  KbdHelper.swallowKey = KbdHelper.active[actionName](e);
1400 if(KbdHelper.swallowKey)
1401  ASPx.Evt.PreventEvent(e);
1402};
1403KbdHelper.OnKeyDown = function(e) {
1404 KbdHelper.swallowKey = false;
1405 if(KbdHelper.TryAccessKey(KbdHelper.getKeyName(e)))
1406  ASPx.Evt.PreventEvent(e);
1407 else 
1408  KbdHelper.ProcessKey(e, "HandleKeyDown"); 
1409};
1410KbdHelper.OnKeyPress = function(e) { KbdHelper.ProcessKey(e, "HandleKeyPress"); };
1411KbdHelper.OnKeyUp = function(e) { KbdHelper.ProcessKey(e, "HandleKeyUp"); };
1412KbdHelper.RegisterAccessKey = function(obj) {
1413 var key;
1414 if(obj.accessKey)
1415  key = "CtrlShift" + obj.accessKey;
1416 else if(obj.keyTipModeShortcut)
1417  key = obj.keyTipModeShortcut;
1418 if(!key) return;
1419 KbdHelper.accessKeys[key.toLowerCase()] = obj.name;
1420};
1421KbdHelper.TryAccessKey = function(code) {
1422 var key = code.toLowerCase ? code.toLowerCase() : String.fromCharCode(code).toLowerCase();
1423 var name = KbdHelper.accessKeys[key];
1424 if(!name) return false;
1425 var obj = ASPx.GetControlCollection().Get(name);
1426 return KbdHelper.ClickAccessKey(obj);
1427};
1428KbdHelper.ClickAccessKey = function (control) {
1429 if (!control) return false;
1430 var el = control.GetMainElement();
1431 if (!el) return false;
1432 el.focus();
1433 setTimeout(function () {
1434  if (KbdHelper.active && KbdHelper.active.FocusByAccessKey)
1435   KbdHelper.active.FocusByAccessKey();
1436 }.aspxBind(this), ASPx.FOCUS_TIMEOUT);
1437 return true;
1438};
1439KbdHelper.getKeyName = function(e) {
1440 var name = "";
1441 if(e.altKey)
1442  name += "Alt";
1443 if(e.ctrlKey)
1444  name += "Ctrl";
1445 if(e.shiftKey)
1446  name += "Shift";
1447 var keyCode = e.key || e.code || String.fromCharCode(ASPx.Evt.GetKeyCode(e));
1448 if(keyCode.match(/key/i))
1449  name += keyCode.replace(/key/i, "");
1450 else if(keyCode.match(/digit/i))
1451  name += keyCode.replace(/digit/i, "");
1452 else if(keyCode.match(/arrow/i))
1453  name += keyCode.replace(/arrow/i, "");
1454 else if(keyCode.match(/ins/i))
1455  name += "Ins";
1456 else if(keyCode.match(/del/i))
1457  name += "Del";
1458 else if(keyCode.match(/back/i))
1459  name += "Back";
1460 else if(!keyCode.match(/alt/i) && !keyCode.match(/control/i) && !keyCode.match(/shift/i))
1461  name += keyCode;
1462 return name.replace(/^a-zA-Z0-9/, "");
1463};
1464AccessKeysHelper = ASPx.CreateClass(KbdHelper, {
1465 constructor: function (control) {
1466  this.constructor.prototype.constructor.call(this, control);
1467  this.accessKeysVisible = false;
1468  this.activeKey = null;
1469  this.accessKey = control.createAccessKey ? control.createAccessKey(control.accessKey) : new AccessKey(control.accessKey);
1470  this.accessKeys = this.accessKey.accessKeys;
1471  this.charIndex = 0;
1472  this.onFocusByAccessKey = null;
1473  this.onClose = null;
1474  this.manualStopProcessing = false;
1475  this.isActive = false;
1476  this.areAccessKeysShown = false;
1477 },
1478 Init: function (control) {
1479  KbdHelper.prototype.Init.call(this);
1480  KbdHelper.RegisterAccessKey(control);   
1481 },
1482 Add: function (accessKey) {
1483  this.accessKey.Add(accessKey);
1484 },
1485 HandleKeyDown: function (e) {
1486  var keyCode = ASPx.Evt.GetKeyCode(e);
1487  var stopProcessing = this.processKeyDown(keyCode);
1488  if (stopProcessing.value) {
1489   this.stopProcessing();
1490   if(this.onClosedOnEscape && (keyCode == ASPx.Key.Esc || stopProcessing.fireEvent))
1491    this.onClosedOnEscape();
1492  }
1493  return stopProcessing;
1494 },
1495 HandleNoFocusAction: function (e, actionName) {
1496  var keyCode = ASPx.Evt.GetKeyCode(e);
1497  if (this.onClosedOnEscape && keyCode == ASPx.Key.Esc && actionName == "HandleKeyDown")
1498   this.onClosedOnEscape();
1499 },
1500 Activate: function () {
1501  KbdHelper.ClickAccessKey(this.control);
1502  this.areAccessKeysShown = true;
1503 },
1504 Stop: function() {
1505  this.stopProcessing();
1506 },
1507 stopProcessing: function () {
1508  this.HideAccessKeys();
1509  if (KbdHelper.active && this.isActive) {
1510   this.isActive = false;
1511   KbdHelper.active.control.GetMainElement().blur();
1512   delete KbdHelper.active;
1513  }
1514 },
1515 onBlur: function() {
1516  if (this.manualStopProcessing) {
1517   this.manualStopProcessing = false;
1518   return;
1519  }
1520  this.HideAccessKeys();
1521  KbdHelper.prototype.onBlur.call(this);
1522 },
1523 processKeyDown: function (keyCode) {
1524  switch (keyCode) {
1525   case ASPx.Key.Left:
1526    this.TryMoveFocusLeft();
1527    return { value: false };
1528   case ASPx.Key.Right:
1529    this.TryMoveFocusRight();
1530    return { value: false };
1531   case ASPx.Key.Esc:
1532    if(this.control.hideAllPopups)
1533     this.control.hideAllPopups(true, true);
1534    if(this.activeKey)
1535     this.activeKey = this.activeKey.Return();
1536    this.charIndex = 0;
1537    if (!this.activeKey)
1538     return { value: true };
1539    break;
1540   case ASPx.Key.Enter:
1541    return { value: true };
1542   default:
1543    if (!ASPx.IsPrintableKey(keyCode))
1544     return { value: false };
1545    var char = String.fromCharCode(keyCode).toUpperCase();
1546    var needToContinue = { value: false };
1547    var keyResult;
1548    if(this.activeKey)
1549     keyResult = this.activeKey.TryAccessKey(char, this.charIndex, needToContinue);
1550    if (needToContinue.value) {
1551     this.charIndex++;
1552     return { value: false };
1553    }
1554    this.charIndex = 0;
1555    if(keyResult !== undefined)
1556     this.activeKey = keyResult;
1557    else
1558     return { value: true, fireEvent: true };
1559    if (!this.activeKey || !this.activeKey.accessKeys || this.activeKey.accessKeys.length == 0) {
1560     if (this.activeKey && this.activeKey.manualStopProcessing) {
1561      this.manualStopProcessing = true;
1562      break;
1563     }
1564     return { value: true, fireEvent: true };
1565    }
1566  }
1567  return { value: false };
1568 },
1569 TryMoveFocusLeft: function (modifier) {},
1570 TryMoveFocusRight: function (modifier) {},
1571 TryMoveFocusUp: function (modifier) {},
1572 TryMoveFocusDown: function (modifier) {},
1573 FocusByAccessKey: function() {
1574  if (this.onFocusByAccessKey)
1575   this.onFocusByAccessKey();
1576  this.HideAccessKeys();
1577  KbdHelper.prototype.FocusByAccessKey.call(this);
1578  this.activeKey = this.accessKey;
1579  this.activeKey.execute();
1580  this.isActive = true;
1581  this.areAccessKeysShown = true;
1582 },
1583 HideAccessKeys: function() {
1584  this.areAccessKeysShown = false;
1585  this.hideAccessKeys(this.accessKey);
1586 },
1587 Update: function() {
1588  this.throttleMethod(this.refresh, 100);
1589 },
1590 refresh: function() {
1591  if(this.activeKey && this.areAccessKeysShown) {
1592   this.activeKey.execute();
1593  }
1594 },
1595 throttleMethod: function(method, delay) {
1596  clearTimeout(method.timerId);
1597  method.timerId = setTimeout(function() {
1598   method.call(this);
1599  }.aspxBind(this), delay);
1600 },
1601 AreAccessKeysShown: function() {
1602  return this.areAccessKeysShown;
1603 },
1604 hideAccessKeys: function (accessKey) {
1605  for (var i = 0, ak; ak = accessKey.accessKeys[i]; i++) {
1606   this.hideAccessKeys(ak);
1607  }
1608  if (accessKey)
1609   accessKey.hide();
1610 },
1611 HandleClick: function(e) {
1612  KbdHelper.prototype.HandleClick.call(this, e);
1613  this.stopProcessing();
1614 }
1615});
1616AccessKey = ASPx.CreateClass(null, {
1617 constructor: function (popupItem, getPopupElement, keyTipElement, key, onlyClick, manualStopProcessing) {
1618  this.key = key ? key : keyTipElement ? ASPxClientUtils.Trim(ASPx.GetInnerText(keyTipElement)) : null;
1619  this.popupItem = popupItem;
1620  this.getPopupElement = getPopupElement;
1621  this.keyTipElement = keyTipElement;
1622  this.accessKeys = [];
1623  this.needShowChilds = true;
1624  this.parent = null;
1625  this.onlyClick = onlyClick;
1626  this.manualStopProcessing = manualStopProcessing;
1627 },
1628 Add: function (accessKey) {
1629  this.accessKeys.push(accessKey);
1630  accessKey.parent = this;
1631 },
1632 TryAccessKey: function (char, index, needToContinue) {
1633  if (!this.accessKeys || this.accessKeys.length == 0)
1634   return;
1635  for (var i = 0, accessKey; accessKey = this.accessKeys[i]; i++) {
1636   if (accessKey.key[index] == char && accessKey.isVisible()) {
1637    if (accessKey.key[index + 1]) {
1638     needToContinue.value = true;
1639    }
1640    else {
1641     accessKey.execute();
1642     return accessKey;
1643    }
1644   } else {
1645    accessKey.hide();
1646   }
1647  }
1648  for (var i = 0, accessKey; accessKey = this.accessKeys[i]; i++) {
1649   var key = accessKey.TryAccessKey(char, index, needToContinue);
1650   if (key)
1651    return key;
1652  }
1653  return;
1654 },
1655 isVisible: function(){
1656  return ASPx.GetElementVisibility(this.keyTipElement);
1657 },
1658 Return: function () {
1659  this.hideChildAccessKeys();
1660  if (this.parent) {
1661   this.parent.showAccessKeys(true);
1662  }  
1663  return this.parent;
1664 },
1665 execute: function () {
1666  this.hideAll();
1667  if (this.popupItem && this.popupItem.accessKeyClick && !this.onlyClick)
1668   this.popupItem.accessKeyClick();
1669  if (this.getPopupElement && this.onlyClick)
1670   ASPx.Evt.EmulateMouseClick(this.getPopupElement(this.popupItem));
1671  if (this.accessKeys)
1672   setTimeout(function () {
1673    this.showAccessKeys(true);
1674   }.aspxBind(this), 100);
1675 },
1676 showAccessKeys: function(directShow) {
1677  if (!directShow && !this.needShowChilds)
1678   return;
1679  for (var i = 0; i < this.accessKeys.length; i++) {
1680   var accessKey = this.accessKeys[i];
1681   if (accessKey) {
1682    var popupElement = accessKey.getPopupElement ? accessKey.getPopupElement(accessKey.popupItem) : null;
1683    if (popupElement && this.isElementVisible(popupElement)) {
1684     this.show(accessKey);
1685    }
1686    accessKey.showAccessKeys();
1687   }
1688  }
1689 },
1690 isElementVisible: function (el) { return ASPx.IsElementVisible(el, true); },
1691 show: function(accessKey) {
1692  var keyTipElement = accessKey.keyTipElement;
1693  var popupElement = accessKey.getPopupElement(accessKey.popupItem);
1694  this.showKeyTipElement(keyTipElement, this.calculateCoordinates(accessKey, keyTipElement, popupElement));
1695 },
1696 showKeyTipElement: function (keyTipElement, coordinates) {
1697  ASPx.SetAbsoluteY(keyTipElement, coordinates.top);
1698  ASPx.SetAbsoluteX(keyTipElement, coordinates.left);
1699  ASPx.SetElementVisibility(keyTipElement, true); 
1700 },
1701 calculateCoordinates: function (accessKey, keyTipElement, popupElement) {
1702  var top = ASPx.GetAbsolutePositionY(popupElement);
1703  var left = ASPx.GetAbsolutePositionX(popupElement);
1704  if (accessKey.popupItem.getAccessKeyPosition)
1705   switch (accessKey.popupItem.getAccessKeyPosition()) {
1706    case "AboveRight":
1707     left = left + popupElement.offsetWidth - keyTipElement.offsetWidth / 3;
1708     top = top - keyTipElement.offsetHeight / 2;
1709     break;
1710    case "Right":
1711     left = left + popupElement.offsetWidth - keyTipElement.offsetWidth / 3;
1712     top = top + popupElement.offsetHeight / 2 - keyTipElement.offsetHeight / 2;
1713     break;
1714    case "BelowRight":
1715     left = left + popupElement.offsetWidth - keyTipElement.offsetWidth / 3;
1716     top = top + keyTipElement.offsetHeight / 2;
1717     break;
1718    default:
1719     top = top + popupElement.offsetHeight;
1720     left = left + popupElement.offsetWidth / 2 - keyTipElement.offsetWidth / 2;
1721     break;
1722   }
1723  else {
1724   top = top + popupElement.offsetHeight;
1725   left = left + popupElement.offsetWidth / 2 - keyTipElement.offsetWidth / 2;
1726  }
1727  return { top: top, left: left };
1728 },
1729 hide: function() {
1730  if (this.keyTipElement)
1731   ASPx.SetElementVisibility(this.keyTipElement, false);
1732 },
1733 hideChildAccessKeys: function () {
1734  this.hideAccessKeys(this.accessKeys);
1735 },
1736 hideAccessKeys: function (accessKeys) {
1737  if (accessKeys) {
1738   for (var i = 0, accessKey; accessKey = accessKeys[i]; i++) {
1739    if (accessKey.keyTipElement)
1740     accessKey.hide();
1741    accessKey.hideChildAccessKeys();
1742   }
1743  }
1744 },
1745 hideAll: function () {
1746  this.getRoot(this).hideChildAccessKeys();
1747 },
1748 getRoot: function (accessKey) {
1749  if (!accessKey.parent)
1750   return accessKey;
1751  return this.getRoot(accessKey.parent);
1752 }
1753});
1754var focusedElement = null;
1755function aspxOnElementFocused(evt) {
1756 evt = ASPx.Evt.GetEvent(evt);
1757 if(evt && evt.target)
1758  focusedElement = evt.target;
1759}
1760function _aspxInitializeFocus() {
1761 if(!ASPx.GetActiveElement())
1762  ASPx.Evt.AttachEventToDocument("focus", aspxOnElementFocused);
1763}
1764function _aspxGetFocusedElement() {
1765 var activeElement = ASPx.GetActiveElement();
1766 return activeElement ? activeElement : focusedElement;
1767}
1768CheckBoxCheckState = {
1769 Checked : "Checked",
1770 Unchecked : "Unchecked",
1771 Indeterminate : "Indeterminate"
1772};
1773CheckBoxInputKey = { 
1774 Checked : "C",
1775 Unchecked : "U",
1776 Indeterminate : "I"
1777};
1778var CheckableElementStateController = ASPx.CreateClass(null, {
1779 constructor: function(imageProperties) {
1780  this.checkBoxStates = [];
1781  this.imageProperties = imageProperties;
1782  this.customImageMarkerClassName = "dxcbCI";
1783 },
1784 GetValueByInputKey: function(inputKey) {
1785  return this.GetFirstValueBySecondValue("Value", "StateInputKey", inputKey);
1786 },
1787 GetInputKeyByValue: function(value) {
1788  return this.GetFirstValueBySecondValue("StateInputKey", "Value", value);
1789 },
1790 GetImagePropertiesNumByInputKey: function(value) {
1791  return this.GetFirstValueBySecondValue("ImagePropertiesNumber", "StateInputKey", value);
1792 },
1793 GetNextCheckBoxValue: function(currentValue, allowGrayed) {
1794  var currentInputKey = this.GetInputKeyByValue(currentValue);
1795  var nextInputKey = '';
1796  switch(currentInputKey) {
1797   case CheckBoxInputKey.Checked:
1798    nextInputKey = CheckBoxInputKey.Unchecked; break;
1799   case CheckBoxInputKey.Unchecked:
1800    nextInputKey = allowGrayed ? CheckBoxInputKey.Indeterminate : CheckBoxInputKey.Checked; break;
1801   case CheckBoxInputKey.Indeterminate:
1802    nextInputKey = CheckBoxInputKey.Checked; break;
1803  }
1804  return this.GetValueByInputKey(nextInputKey);
1805 },
1806 GetCheckStateByInputKey: function(inputKey) {
1807  switch(inputKey) {
1808   case CheckBoxInputKey.Checked: 
1809    return CheckBoxCheckState.Checked;
1810   case CheckBoxInputKey.Unchecked: 
1811    return CheckBoxCheckState.Unchecked;
1812   case CheckBoxInputKey.Indeterminate: 
1813    return CheckBoxCheckState.Indeterminate;
1814  }
1815 },
1816 GetValueByCheckState: function(checkState) {
1817  switch(checkState) {
1818   case CheckBoxCheckState.Checked: 
1819    return this.GetValueByInputKey(CheckBoxInputKey.Checked);
1820   case CheckBoxCheckState.Unchecked: 
1821    return this.GetValueByInputKey(CheckBoxInputKey.Unchecked);
1822   case CheckBoxCheckState.Indeterminate: 
1823    return this.GetValueByInputKey(CheckBoxInputKey.Indeterminate);
1824  }
1825 },
1826 GetFirstValueBySecondValue: function(firstValueName, secondValueName, secondValue) {
1827  return this.GetValueByFunc(firstValueName, 
1828   function(checkBoxState) { return checkBoxState[secondValueName] === secondValue; });
1829 },
1830 GetValueByFunc: function(valueName, func) {
1831  for(var i = 0; i < this.checkBoxStates.length; i++) {
1832   if(func(this.checkBoxStates[i]))
1833    return this.checkBoxStates[i][valueName];
1834  }  
1835 },
1836 AssignElementClassName: function(element, cssClassPropertyKey, disabledCssClassPropertyKey, assignedClassName) {
1837  var classNames = [ ];
1838  for(var i = 0; i < this.imageProperties[cssClassPropertyKey].length; i++) {
1839   classNames.push(this.imageProperties[disabledCssClassPropertyKey][i]);
1840   classNames.push(this.imageProperties[cssClassPropertyKey][i]);
1841  }
1842  var elementClassName = element.className;
1843  for(var i = 0; i < classNames.length; i++) {
1844   var className = classNames[i];
1845   var index = elementClassName.indexOf(className);
1846   if(index > -1)
1847    elementClassName = elementClassName.replace((index == 0 ? '' : ' ') + className, "");
1848  }
1849  elementClassName += " " + assignedClassName;
1850  element.className = elementClassName;
1851 },
1852 UpdateInternalCheckBoxDecoration: function(mainElement, inputKey, enabled) {
1853  var imagePropertiesNumber = this.GetImagePropertiesNumByInputKey(inputKey);
1854  for(var imagePropertyKey in this.imageProperties) {
1855   if(this.imageProperties.hasOwnProperty(imagePropertyKey)) {
1856    var propertyValue = this.imageProperties[imagePropertyKey][imagePropertiesNumber];
1857    propertyValue = propertyValue || !isNaN(propertyValue) ? propertyValue : "";
1858    switch(imagePropertyKey) {
1859     case "0" : mainElement.title = propertyValue; break;
1860     case "1" : mainElement.style.width = propertyValue + (propertyValue != "" ? "px" : ""); break;
1861     case "2" : mainElement.style.height = propertyValue + (propertyValue != "" ? "px" : ""); break;
1862    }
1863    if(enabled) {
1864     switch(imagePropertyKey) {
1865      case "3" : this.SetImageSrc(mainElement, propertyValue); break;
1866      case "4" : 
1867       this.AssignElementClassName(mainElement, "4", "8", propertyValue);
1868       break;
1869      case "5" : this.SetBackgroundPosition(mainElement, propertyValue, true); break;
1870      case "6" : this.SetBackgroundPosition(mainElement, propertyValue, false); break;
1871     }
1872    } else {
1873     switch(imagePropertyKey) {
1874      case "7" : this.SetImageSrc(mainElement, propertyValue); break;
1875      case "8" : 
1876       this.AssignElementClassName(mainElement, "4", "8", propertyValue);
1877       break;
1878      case "9" : this.SetBackgroundPosition(mainElement, propertyValue, true); break;
1879      case "10" : this.SetBackgroundPosition(mainElement, propertyValue, false); break;
1880     }
1881    }
1882   }
1883  }
1884 },
1885 SetImageSrc: function(mainElement, src) {
1886  if(src === ""){
1887   mainElement.style.backgroundImage = "";
1888   mainElement.style.backgroundPosition = "";
1889   ASPx.RemoveClassNameFromElement(mainElement, this.customImageMarkerClassName);
1890  }
1891  else{
1892   mainElement.style.backgroundImage = "url('" + src + "')";
1893   this.SetBackgroundPosition(mainElement, 0, true);
1894   this.SetBackgroundPosition(mainElement, 0, false);
1895   ASPx.AddClassNameToElement(mainElement, this.customImageMarkerClassName);
1896  }
1897 },
1898 SetBackgroundPosition: function(element, value, isX) {
1899  if(value === "") {
1900   element.style.backgroundPosition = value;
1901   return;
1902  }
1903  if(element.style.backgroundPosition === "")
1904   element.style.backgroundPosition = isX ? "-" + value.toString() + "px 0px" : "0px -" + value.toString() + "px";
1905  else {
1906   var position = element.style.backgroundPosition.split(' ');
1907   element.style.backgroundPosition = isX ? '-' + value.toString() + "px " + position[1] :  position[0] + " -" + value.toString() + "px";
1908  }
1909 },
1910 AddState: function(value, stateInputKey, imagePropertiesNumber) {
1911  this.checkBoxStates.push({
1912   "Value" : value, 
1913   "StateInputKey" : stateInputKey, 
1914   "ImagePropertiesNumber" : imagePropertiesNumber
1915  });
1916 },
1917 GetAriaCheckedValue: function(state) {
1918  switch(state) {
1919   case ASPx.CheckBoxCheckState.Checked: return "true";
1920   case ASPx.CheckBoxCheckState.Unchecked: return "false";
1921   case ASPx.CheckBoxCheckState.Indeterminate: return "mixed";
1922   default: return "";
1923  }
1924 },
1925 GetAriaSelectedValue: function(state) {
1926  switch(state) {
1927   case ASPx.CheckBoxCheckState.Checked: return "true";
1928   case ASPx.CheckBoxCheckState.Unchecked: return "false";
1929   case ASPx.CheckBoxCheckState.Indeterminate: return "undefined";
1930   default: return "";
1931  }
1932 },
1933 SetAriaCheckedSelectedAttributes: function(mainElement, state) {
1934  if(mainElement.attributes["aria-checked"] !== undefined) {
1935   var ariaCheckedValue = this.GetAriaCheckedValue(state);
1936   mainElement.setAttribute("aria-checked", ariaCheckedValue);
1937  }
1938  if(mainElement.attributes["aria-selected"] !== undefined) {
1939   var ariaSelectedValue = this.GetAriaSelectedValue(state);
1940   mainElement.setAttribute("aria-selected", ariaSelectedValue);
1941  }
1942 }
1943});
1944CheckableElementStateController.Create = function(imageProperties, valueChecked, valueUnchecked, valueGrayed, allowGrayed) {
1945 var stateController = new CheckableElementStateController(imageProperties);
1946 stateController.AddState(valueChecked, CheckBoxInputKey.Checked, 0);
1947 stateController.AddState(valueUnchecked, CheckBoxInputKey.Unchecked, 1);
1948 if(typeof(valueGrayed) != "undefined")
1949  stateController.AddState(valueGrayed, CheckBoxInputKey.Indeterminate, allowGrayed ? 2 : 1);
1950 stateController.allowGrayed = allowGrayed;
1951 return stateController;
1952};
1953var CheckableElementHelper = ASPx.CreateClass(null, {
1954 InternalCheckBoxInitialize: function(internalCheckBox) {
1955  this.AttachToMainElement(internalCheckBox);
1956  this.AttachToInputElement(internalCheckBox);
1957 },
1958 AttachToMainElement: function(internalCheckBox) {
1959  var instance = this;
1960  if(internalCheckBox.mainElement) {
1961    var toggleEvent = internalCheckBox.displaySwitch ? ASPx.TouchUIHelper.touchMouseDownEventName : "click";
1962    ASPx.Evt.AttachEventToElement(internalCheckBox.mainElement, toggleEvent,
1963    function (evt) {
1964     if(ASPx.Evt.IsRightButtonPressed(evt))
1965      return;
1966     instance.InvokeClick(internalCheckBox, evt);
1967     if(!internalCheckBox.disableCancelBubble)
1968      return ASPx.Evt.PreventEventAndBubble(evt);
1969    }
1970   );
1971   ASPx.Evt.AttachEventToElement(internalCheckBox.mainElement, "mousedown",
1972    function (evt) {
1973     internalCheckBox.Refocus();
1974    }
1975   );
1976   ASPx.Evt.PreventElementDragAndSelect(internalCheckBox.mainElement, true);
1977  }
1978 },
1979 AttachToInputElement: function(internalCheckBox) {
1980  var instance = this;
1981  if(internalCheckBox.inputElement && internalCheckBox.mainElement) {
1982   var checkableElement = internalCheckBox.accessibilityCompliant ? internalCheckBox.mainElement : internalCheckBox.inputElement;
1983   ASPx.Evt.AttachEventToElement(checkableElement, "focus",
1984    function (evt) { 
1985     if(!internalCheckBox.enabled)
1986      checkableElement.blur();
1987     else
1988      internalCheckBox.OnFocus();
1989    }
1990   );
1991   ASPx.Evt.AttachEventToElement(checkableElement, "blur", 
1992    function (evt) { 
1993     internalCheckBox.OnLostFocus();
1994    }
1995   );
1996   ASPx.Evt.AttachEventToElement(checkableElement, "keyup",
1997    function (evt) { 
1998     if(ASPx.Evt.GetKeyCode(evt) == ASPx.Key.Space)
1999      instance.InvokeClick(internalCheckBox, evt);
2000    }
2001   );
2002   ASPx.Evt.AttachEventToElement(checkableElement, "keydown",
2003    function (evt) { 
2004     if(ASPx.Evt.GetKeyCode(evt) == ASPx.Key.Space)
2005      return ASPx.Evt.PreventEvent(evt);
2006    }
2007   );
2008  }
2009 },
2010 IsKBSInputWrapperExist: function() {
2011  return ASPx.Browser.Opera || ASPx.Browser.WebKitFamily;
2012 },
2013 GetICBMainElementByInput: function(icbInputElement) {
2014  return this.IsKBSInputWrapperExist() ? icbInputElement.parentNode.parentNode : icbInputElement.parentNode;
2015 },
2016 RequirePreventFocus: function() { return false; },
2017 InvokeClick: function(internalCheckBox, evt) {
2018  if(internalCheckBox.enabled && !internalCheckBox.GetReadOnly()) {
2019   var inputElementValue = internalCheckBox.inputElement.value;
2020   var focusableElement = internalCheckBox.accessibilityCompliant ? internalCheckBox.mainElement : internalCheckBox.inputElement; 
2021   if(!this.RequirePreventFocus())
2022    focusableElement.focus();
2023   internalCheckBox.inputElement.value = inputElementValue; 
2024   this.InvokeClickCore(internalCheckBox, evt);
2025   }
2026 },
2027 InvokeClickCore: function(internalCheckBox, evt) {
2028  internalCheckBox.OnClick(evt);
2029 }
2030});
2031CheckableElementHelper.Instance = new CheckableElementHelper();
2032var CheckBoxInternal = ASPx.CreateClass(null, {
2033 constructor: function(inputElement, stateController, allowGrayed, allowGrayedByClick, helper, container, storeValueInInput, key, disableCancelBubble,
2034  accessibilityCompliant, displaySwitch) {
2035  this.inputElement = inputElement;
2036  this.mainElement = helper.GetICBMainElementByInput(this.inputElement);
2037  this.name = (key ? key : this.inputElement.id) + CheckBoxInternal.GetICBMainElementPostfix();
2038  this.mainElement.id = this.name;
2039  this.stateController = stateController;
2040  this.container = container;
2041  this.allowGrayed = allowGrayed;
2042  this.allowGrayedByClick = allowGrayedByClick;
2043  this.autoSwitchEnabled = true;
2044  this.displaySwitch = displaySwitch;
2045  this.storeValueInInput = !!storeValueInInput;
2046  this.storedInputKey = !this.storeValueInInput ? this.inputElement.value : null;
2047  this.disableCancelBubble = !!disableCancelBubble;
2048  this.accessibilityCompliant = accessibilityCompliant;
2049  this.focusDecoration = null;
2050  this.focused = false;
2051  this.focusLocked = false;
2052  this.enabled = !this.mainElement.className.match(/dxWeb_\w+Disabled(\b|_)/);
2053  this.readOnly = false;
2054  this.preventFocus = helper.RequirePreventFocus();
2055  this.CheckedChanged = new ASPxClientEvent();
2056  this.Focus = new ASPxClientEvent();
2057  this.LostFocus = new ASPxClientEvent();
2058  helper.InternalCheckBoxInitialize(this);
2059 },
2060 GetReadOnly: function() {
2061  return this.readOnly;
2062 },
2063 ChangeInputElementTabIndex: function() {  
2064  var changeMethod = this.enabled ? ASPx.Attr.RestoreTabIndexAttribute : ASPx.Attr.SaveTabIndexAttributeAndReset;
2065  changeMethod(this.inputElement);
2066 },
2067 CreateFocusDecoration: function(focusedStyle) {
2068   this.focusDecoration = new FocusedStyleDecoration(this);
2069   this.focusDecoration.AddStyle('F', focusedStyle[0], focusedStyle[1]);
2070   this.focusDecoration.AddPostfix("");
2071 },
2072 UpdateFocusDecoration: function() {
2073  this.focusDecoration.Update();
2074 },  
2075 StoreInputKey: function(inputKey) {
2076  if(this.storeValueInInput)
2077   this.inputElement.value = inputKey;
2078  else
2079   this.storedInputKey = inputKey;
2080 },
2081 GetStoredInputKey: function() {
2082  if(this.storeValueInInput)
2083   return this.inputElement.value;
2084  else
2085   return this.storedInputKey;
2086 },
2087 OnClick: function(e) {
2088  if(this.autoSwitchEnabled) {
2089   var currentValue = this.GetValue();
2090   var value = this.stateController.GetNextCheckBoxValue(currentValue, this.allowGrayedByClick && this.allowGrayed);
2091   this.SetValue(value);
2092  }
2093  this.CheckedChanged.FireEvent(this, e);
2094 },
2095 OnFocus: function() {
2096  if(!this.IsFocusLocked()) {
2097   this.focused = true;
2098   this.UpdateFocusDecoration();
2099   this.Focus.FireEvent(this, null);
2100  } else
2101   this.UnlockFocus();
2102 },
2103 OnLostFocus: function() {
2104  if(!this.IsFocusLocked()) {
2105   this.focused = false;
2106   this.UpdateFocusDecoration();
2107   this.LostFocus.FireEvent(this, null);
2108  }
2109 },
2110 Refocus: function() {
2111  if(this.preventFocus) return;
2112  if(this.focused) {
2113   this.LockFocus();
2114   this.inputElement.blur();
2115   if(ASPx.Browser.MacOSMobilePlatform) {
2116    window.setTimeout(function() {
2117     ASPx.SetFocus(this.inputElement);
2118    }, ASPx.FOCUS_TIMEOUT);
2119   } else {
2120    ASPx.SetFocus(this.inputElement);
2121   }
2122  }
2123 },
2124 LockFocus: function() {
2125  this.focusLocked = true;
2126 },
2127 UnlockFocus: function() {
2128  this.focusLocked = false;
2129 },
2130 IsFocusLocked: function() {
2131  if(!!ASPx.Attr.GetAttribute(this.mainElement, ASPx.Attr.GetTabIndexAttributeName()))
2132   return false;
2133  return this.focusLocked;
2134 },
2135 SetValue: function(value, force) {
2136  var currentValue = this.GetValue();
2137  if(currentValue !== value || force) {
2138   var newInputKey = this.stateController.GetInputKeyByValue(value);
2139   if(newInputKey) {
2140    this.StoreInputKey(newInputKey);   
2141    this.stateController.UpdateInternalCheckBoxDecoration(this.mainElement, newInputKey, this.enabled);
2142   }
2143  }
2144  if(this.accessibilityCompliant) {
2145   var state = this.GetCurrentCheckState();
2146   this.stateController.SetAriaCheckedSelectedAttributes(this.mainElement, state);
2147  }
2148 },
2149 GetValue: function() {
2150  return this.stateController.GetValueByInputKey(this.GetCurrentInputKey());
2151 },
2152 GetCurrentCheckState: function() {
2153  return this.stateController.GetCheckStateByInputKey(this.GetCurrentInputKey());
2154 },
2155 GetCurrentInputKey: function() {
2156  return this.GetStoredInputKey();
2157 },
2158 GetChecked: function() {
2159  return this.GetCurrentInputKey() === CheckBoxInputKey.Checked;
2160 },
2161 SetChecked: function(checked) {
2162  var newValue = this.stateController.GetValueByCheckState(checked ? CheckBoxCheckState.Checked : CheckBoxCheckState.Unchecked);
2163  this.SetValue(newValue);
2164 },
2165 SetEnabled: function(enabled) {
2166  if(this.enabled != enabled) {
2167   this.enabled = enabled;
2168   this.stateController.UpdateInternalCheckBoxDecoration(this.mainElement, this.GetCurrentInputKey(), this.enabled);
2169   this.ChangeInputElementTabIndex();
2170  }
2171 },
2172 GetEnabled: function() {
2173  return this.enabled;
2174 }
2175});
2176CheckBoxInternal.GetICBMainElementPostfix = function() {
2177 return "_D";
2178};
2179var CheckBoxInternalCollection = ASPx.CreateClass(CollectionBase, {
2180 constructor: function(imageProperties, allowGrayed, storeValueInInput, helper, disableCancelBubble, accessibilityCompliant) {
2181  this.constructor.prototype.constructor.call(this);
2182  this.stateController = allowGrayed 
2183   ? CheckableElementStateController.Create(imageProperties, CheckBoxInputKey.Checked, CheckBoxInputKey.Unchecked, CheckBoxInputKey.Indeterminate, true)
2184   : CheckableElementStateController.Create(imageProperties, CheckBoxInputKey.Checked, CheckBoxInputKey.Unchecked);
2185  this.helper = helper || CheckableElementHelper.Instance;
2186  this.storeValueInInput = !!storeValueInInput;
2187  this.disableCancelBubble = !!disableCancelBubble;
2188  this.accessibilityCompliant = accessibilityCompliant;
2189 },
2190 Add: function(key, inputElement, container) {
2191  this.Remove(key);
2192  var checkBox = this.CreateInternalCheckBox(key, inputElement, container);
2193  CollectionBase.prototype.Add.call(this, key, checkBox);
2194  return checkBox;
2195 },
2196 SetImageProperties: function(imageProperties) {
2197  this.stateController.imageProperties = imageProperties;
2198 },
2199 CreateInternalCheckBox: function(key, inputElement, container) {
2200  return new CheckBoxInternal(inputElement, this.stateController, this.stateController.allowGrayed, false, this.helper, container, 
2201   this.storeValueInInput, key, this.disableCancelBubble, this.accessibilityCompliant);
2202 }
2203});
2204var FocusedStyleDecoration = ASPx.CreateClass(null, {
2205 constructor: function(editor) {
2206  this.editor = editor;
2207  this.postfixList = [];
2208  this.styles = {};
2209  this.innerStyles = {};
2210 },
2211 AddPostfix: function(value) {
2212  this.postfixList.push(value);
2213 },
2214 AddStyle: function(key, className, cssText) {
2215  this.styles[key] = this.CreateRule(className, cssText);
2216  this.innerStyles[key] = this.CreateRule("", this.FilterInnerCss(cssText));
2217 },
2218 CreateRule: function(className, cssText) {
2219  return ASPx.Str.Trim(className + " " + ASPx.CreateImportantStyleRule(this.GetStyleSheet(), cssText));
2220 },
2221 GetStyleSheet: function() {
2222  return ASPx.GetCurrentStyleSheet();
2223 },
2224 FilterInnerCss: function(css) {
2225  return css.replace(/(border|background-image)[^:]*:[^;]+/gi, "");
2226 },
2227 Update: function() {
2228  for(var i = 0; i < this.postfixList.length; i++) {
2229   var postfix = this.postfixList[i];
2230   var inner = postfix.length > 0;
2231   var element = this.GetElementByPostfix(postfix);
2232   if(element)
2233    this.ApplyStyles(element, inner);
2234  }
2235 },
2236 GetElementByPostfix: function(postfix) {
2237  return ASPx.GetElementById(this.editor.name + postfix);
2238 },
2239 ApplyStyles: function(element, inner) {
2240  this.ApplyFocusedStyle(element, inner);
2241 },
2242 ApplyFocusedStyle: function(element, inner) {
2243  if(this.HasDecoration("F"))
2244   this.ApplyDecoration("F", element, inner, this.editor.focused);
2245 },
2246 HasDecoration: function(key) {
2247  return !!this.styles[key];
2248 },
2249 ApplyDecoration: function(key, element, inner, active) {
2250  var value = inner ? this.innerStyles[key] : this.styles[key];
2251  this.RemoveDecoration(element, value);
2252  if(active)
2253   ASPx.AddClassNameToElement(element, value);
2254 },
2255 RemoveDecoration: function(element, value) {
2256  ASPx.RemoveClassNameFromElement(element, value);
2257 },
2258 ApplyDecorationCore: function() {
2259 },
2260 EnsureElementBorder: function(element) {
2261  var border = parseInt(element.border) || 0;
2262  element.border = 1;
2263  element.border = border;
2264 }
2265});
2266var EditorStyleDecoration = ASPx.CreateClass(FocusedStyleDecoration, {
2267 constructor: function(editor) {
2268  this.constructor.prototype.constructor.call(this, editor);
2269  this.lockUpdate = false;
2270 },
2271 LockUpdate: function() {
2272  this.lockUpdate = true;
2273 },
2274 UnlockUpdate: function() {
2275  this.lockUpdate = false;
2276 },
2277 IsUpdateLocked: function() {
2278  return this.lockUpdate;
2279 },
2280 Update: function () {
2281  if(this.IsUpdateLocked())
2282   return;
2283  ASPx.FocusedStyleDecoration.prototype.Update.call(this);
2284 },
2285 ApplyStyles: function (element, inner) {
2286  this.ApplyInvalidStyle(element, inner);
2287  ASPx.FocusedStyleDecoration.prototype.ApplyStyles.call(this, element, inner);
2288 },
2289 ApplyInvalidStyle: function (element, inner) {
2290  if(this.HasDecoration("I")) {
2291   var isValid = this.editor.GetIsValid();
2292   this.ApplyDecoration("I", element, inner, !isValid);
2293  }
2294 }
2295});
2296var TextEditorStyleDecoration = ASPx.CreateClass(EditorStyleDecoration, {
2297 constructor: function(editor) {
2298  this.constructor.prototype.constructor.call(this, editor);
2299  this.nullTextClassName = "";
2300 },
2301 ApplyStyles: function(element, inner) {
2302  ASPx.EditorStyleDecoration.prototype.ApplyStyles.call(this, element, inner);
2303  this.ApplyNullTextStyle(element, inner);
2304 },
2305 ApplyNullTextStyle: function(element, inner) {
2306  if(!this.HasDecoration("N"))
2307   return;
2308  var apply = !this.editor.focused && this.editor.CanApplyNullTextDecoration();
2309  this.EnsureSpellcheckAttribute(element, apply);
2310  this.ApplyDecoration("N", element, inner, apply);
2311 },
2312 EnsureSpellcheckAttribute: function(element, apply) {
2313  if(apply)
2314   ASPx.Attr.ChangeAttribute(element, "spellcheck", "false");
2315  else
2316   ASPx.Attr.RestoreAttribute(element, "spellcheck");
2317 },
2318 ApplyNullTextClassName: function(active) {
2319  var nullTextClassName = this.GetNullTextClassName();
2320  var editorMainElement = this.editor.GetMainElement();
2321  if(active)
2322   ASPx.AddClassNameToElement(editorMainElement, nullTextClassName);
2323  else
2324   ASPx.RemoveClassNameFromElement(editorMainElement, nullTextClassName);
2325 },
2326 GetNullTextClassName: function() {
2327  if (!this.nullTextClassName)
2328   this.InitializeNullTextClassName();
2329  return this.nullTextClassName;
2330 },
2331 InitializeNullTextClassName: function() {
2332  var nullTextStyle = this.styles["N"];
2333  if (nullTextStyle) {
2334   var nullTextStyleClassNames = nullTextStyle.split(" ");
2335   for (var i = 0; i < nullTextStyleClassNames.length; i++)
2336    if (nullTextStyleClassNames[i].match("dxeNullText"))
2337     this.nullTextClassName = nullTextStyleClassNames[i];
2338  }
2339 }
2340});
2341var touchUIHelperUsePointerEvents = (ASPx.Browser.Edge || ASPx.Browser.EdgeWebKit) && ASPx.Browser.MSTouchUI && !!window.PointerEvent;
2342var TouchUIHelper = {
2343 isGesture: false,
2344 isMouseEventFromScrolling: false,
2345 isNativeScrollingAllowed: true,
2346 clickSensetivity: 10,
2347 documentTouchHandlers: {},
2348 documentEventAttachingAllowed: true,
2349 msTouchDraggableClassName: "dxMSTouchDraggable",
2350 touchMouseDownEventName: ASPx.Browser.WebKitTouchUI ? "touchstart" : (touchUIHelperUsePointerEvents ? "pointerdown" : "mousedown"),
2351 touchMouseUpEventName: ASPx.Browser.WebKitTouchUI ? "touchend" : (touchUIHelperUsePointerEvents ? "pointerup" : "mouseup"),
2352 touchMouseMoveEventName: ASPx.Browser.WebKitTouchUI ? "touchmove" : (touchUIHelperUsePointerEvents ? "pointermove" : "mousemove"),
2353 startPreventingTouchMove: function() {
2354  if(touchUIHelperUsePointerEvents)
2355   ASPx.Evt.AttachEventToDocument("touchmove", ASPx.Evt.PreventEvent);
2356 },
2357 stopPreventingTouchMove: function() {
2358  if(touchUIHelperUsePointerEvents)
2359   ASPx.Evt.DetachEventFromDocument("touchmove", ASPx.Evt.PreventEvent);
2360 },
2361 isTouchEvent: function(evt) {
2362  if(!evt) return false;
2363  return ASPx.Browser.WebKitTouchUI && ASPx.IsExists(evt.changedTouches); 
2364 },
2365 isTouchEventName: function(eventName) {
2366  return ASPx.Browser.WebKitTouchUI && (eventName.indexOf("touch") > -1 || eventName.indexOf("gesture") > -1);
2367 },
2368 getEventX: function(evt) {
2369  var touchPoint = null;
2370  if(evt.changedTouches.length > 0)
2371   touchPoint = evt.changedTouches;
2372  else if(evt.targetTouches.length > 0)
2373   touchPoint = evt.targetTouches;
2374  return touchPoint ? touchPoint[0].pageX : 0;
2375 },
2376 getEventY: function(evt) { 
2377  var touchPoint = null;
2378  if(evt.changedTouches.length > 0)
2379   touchPoint = evt.changedTouches;
2380  else if(evt.targetTouches.length > 0)
2381   touchPoint = evt.targetTouches;
2382  return touchPoint ? touchPoint[0].pageY : 0;
2383 },
2384 getWebkitMajorVersion: function(){
2385  if(!this.webkitMajorVersion){
2386   var regExp = new RegExp("applewebkit/(\\d+)", "i");
2387   var matches = regExp.exec(ASPx.Browser.UserAgent);
2388   if(matches && matches.index >= 1)
2389    this.webkitMajorVersion = matches[1];
2390  }
2391  return this.webkitMajorVersion;
2392 },
2393 getIsLandscapeOrientation: function(){
2394  if(ASPx.Browser.MacOSMobilePlatform || ASPx.Browser.AndroidMobilePlatform)
2395   return Math.abs(window.orientation) == 90;
2396  return ASPx.GetDocumentClientWidth() > ASPx.GetDocumentClientHeight();
2397 },
2398 nativeScrollingSupported: function() {
2399  var allowedSafariVersion = ASPx.Browser.Version >= 5.1 && ASPx.Browser.Version < 8; 
2400  var webkitMajorVersion = this.getWebkitMajorVersion();
2401  var allowedWebKitVersion = webkitMajorVersion > 533 && webkitMajorVersion < 600;
2402  return (ASPx.Browser.MacOSMobilePlatform && (allowedSafariVersion || allowedWebKitVersion))
2403   || (ASPx.Browser.AndroidMobilePlatform && ASPx.Browser.PlaformMajorVersion >= 3) || (ASPx.Browser.MSTouchUI);
2404 },
2405 makeScrollableIfRequired: function(element, options) {
2406  if(ASPx.Browser.WebKitTouchUI && element) {
2407   var overflow = ASPx.GetCurrentStyle(element).overflow;
2408   if(element.tagName == "DIV" &&  overflow != "hidden" && overflow != "visible" ){
2409    return this.MakeScrollable(element);
2410   }
2411  }
2412 },
2413 preventScrollOnEvent: function(evt){
2414 },
2415 handleFastTapIfRequired: function(evt, action, preventCommonClickEvents) {
2416  if(ASPx.Browser.WebKitTouchUI && evt.type == 'touchstart' && action) {
2417   this.FastTapHelper.HandleFastTap(evt, action, preventCommonClickEvents);
2418   return true;
2419  }
2420  return false;
2421 },
2422 ensureDocumentSizesCorrect: function (){
2423  return (document.documentElement.clientWidth - document.documentElement.clientHeight) / (screen.width - screen.height) > 0;
2424 },
2425 ensureOrientationChanged: function(onOrientationChangedFunction){
2426  if(ASPxClientUtils.iOSPlatform || this.ensureDocumentSizesCorrect())
2427   onOrientationChangedFunction();
2428  else {
2429   window.setTimeout(function(){
2430    this.ensureOrientationChanged(onOrientationChangedFunction);
2431   }.aspxBind(this), 100);
2432  }
2433 },
2434 onEventAttachingToDocument: function(eventName, func){
2435  if(ASPx.Browser.MacOSMobilePlatform && this.isTouchEventName(eventName)) {
2436   if(!this.documentTouchHandlers[eventName])
2437    this.documentTouchHandlers[eventName] = [];
2438   this.documentTouchHandlers[eventName].push(func);
2439   return this.documentEventAttachingAllowed;
2440  }
2441  return true;
2442 },
2443 onEventDettachedFromDocument: function(eventName, func){
2444  if(ASPx.Browser.MacOSMobilePlatform && this.isTouchEventName(eventName)) {
2445   var handlers = this.documentTouchHandlers[eventName];
2446   if(handlers)
2447    ASPx.Data.ArrayRemove(handlers, func);
2448  }
2449 },
2450 processDocumentTouchEventHandlers: function(proc) {
2451  var touchEventNames = ["touchstart", "touchend", "touchmove", "gesturestart", "gestureend"];
2452  for(var i = 0; i < touchEventNames.length; i++) {
2453   var eventName = touchEventNames[i];
2454   var handlers = this.documentTouchHandlers[eventName];
2455   if(handlers) {
2456    for(var j = 0; j < handlers.length; j++) {
2457     proc(eventName,handlers[j]);
2458    }
2459   }
2460  }
2461 },
2462 removeDocumentTouchEventHandlers: function() {
2463  if(ASPx.Browser.MacOSMobilePlatform) {
2464   this.documentEventAttachingAllowed = false;
2465   this.processDocumentTouchEventHandlers(ASPx.Evt.DetachEventFromDocumentCore);
2466  }
2467 },
2468 restoreDocumentTouchEventHandlers: function () {
2469  if(ASPx.Browser.MacOSMobilePlatform) {
2470   this.documentEventAttachingAllowed = true;
2471   this.processDocumentTouchEventHandlers(ASPx.Evt.AttachEventToDocumentCore);
2472  }
2473 },
2474 IsNativeScrolling: function() {
2475  return TouchUIHelper.nativeScrollingSupported() && TouchUIHelper.isNativeScrollingAllowed;
2476 },
2477 pointerEnabled: !!(window.PointerEvent || window.MSPointerEvent),
2478 pointerDownEventName: window.PointerEvent ? "pointerdown" : "MSPointerDown",
2479 pointerUpEventName: window.PointerEvent ? "pointerup" : "MSPointerUp",
2480 pointerCancelEventName: window.PointerEvent ? "pointercancel" : "MSPointerCancel",
2481 pointerMoveEventName: window.PointerEvent ? "pointermove" : "MSPointerMove",
2482 pointerOverEventName: window.PointerEvent ? "pointerover" : "MSPointerOver",
2483 pointerOutEventName: window.PointerEvent ? "pointerout" : "MSPointerOut",
2484 pointerType: {
2485  Touch: "touch",
2486  Pen: "pen",
2487  Mouse: "mouse"
2488 },
2489 msGestureEnabled: !!(window.PointerEvent || window.MSPointerEvent) && typeof(MSGesture) != "undefined",
2490 msTouchCreateGesturesWrapper: function(element, onTap){
2491  if(!TouchUIHelper.msGestureEnabled) 
2492   return;
2493  var gesture = new MSGesture();
2494  gesture.target = element;
2495  ASPx.Evt.AttachEventToElement(element, TouchUIHelper.pointerDownEventName, function(evt){
2496   gesture.addPointer(evt.pointerId);
2497  });
2498  ASPx.Evt.AttachEventToElement(element, TouchUIHelper.pointerUpEventName, function(evt){
2499   gesture.stop();
2500  });
2501  if(onTap)
2502   ASPx.Evt.AttachEventToElement(element, "MSGestureTap", onTap);
2503  return gesture;
2504 },
2505 useLongTapHelper: function () {
2506  return ASPx.Browser.Safari && ASPx.Browser.TouchUI;
2507 },
2508 attachLongTapHandler: function(element, handler, onlyBubbling) {
2509  var timerID = -1;
2510  var timeout = 1000;
2511  var event = null;
2512  var preventClickEvent = false;
2513  var startX = -1;
2514  var startY = -1;
2515  var pixelLimit = 5;
2516  function onTouchMouseDown(evt) {
2517   abortWating();
2518   event = evt;
2519   startX = evt.pageX;
2520   startY = evt.pageY;
2521   preventClickEvent = false;
2522   timerID = window.setTimeout(onTimeout, timeout);
2523  }
2524  function onTouchMouseMove(evt) {
2525   if (!isUnderTouch())
2526    return;
2527   var shiftX = Math.abs(startX - evt.pageX),
2528    shiftY = Math.abs(startY - evt.pageY),
2529    maxShift = Math.max(shiftX, shiftY);
2530   if (maxShift > pixelLimit)
2531    abortWating();
2532  }
2533  function onTouchMouseUp(evt) {
2534   abortWating();
2535   if (preventClickEvent) {
2536    ASPx.Evt.PreventEventAndBubble(evt);
2537    preventClickEvent = false;
2538   }
2539  }
2540  function onTimeout() {
2541   handler(event);
2542   preventClickEvent = true;
2543   abortWatingInternal();
2544  }
2545  function isUnderTouch() {
2546   return timerID !== -1;
2547  }
2548  function abortWating() {
2549   if (isUnderTouch()) {
2550    window.clearTimeout(timerID);
2551    abortWatingInternal();
2552   }
2553  }
2554  function abortWatingInternal() {
2555   timerID = -1;
2556   event = null;
2557  }
2558  ASPx.Evt.AttachEventToElement(element, TouchUIHelper.touchMouseDownEventName, onTouchMouseDown, onlyBubbling);
2559  ASPx.Evt.AttachEventToElement(element, TouchUIHelper.touchMouseMoveEventName, onTouchMouseMove, onlyBubbling);
2560  ASPx.Evt.AttachEventToElement(element, TouchUIHelper.touchMouseUpEventName, onTouchMouseUp, onlyBubbling);
2561  element.style["-webkit-user-select"] = "none";
2562  return function () {
2563   ASPx.Evt.DetachEventFromElement(element, TouchUIHelper.touchMouseDownEventName, onTouchMouseDown);
2564   ASPx.Evt.DetachEventFromElement(element, TouchUIHelper.touchMouseMoveEventName, onTouchMouseMove);
2565   ASPx.Evt.DetachEventFromElement(element, TouchUIHelper.touchMouseUpEventName, onTouchMouseUp);
2566   element.style["-webkit-user-select"] = "";
2567  };
2568 }
2569};
2570var CacheHelper = {};
2571CacheHelper.GetCachedValueCore = function(obj, key, func, cacheObj, fillValueMethod) {
2572 if(!cacheObj)
2573  cacheObj = obj;
2574 if(!cacheObj.cache)
2575  cacheObj.cache = {};
2576 if(!key) 
2577  key = "default";
2578 fillValueMethod(obj, key, func, cacheObj);
2579 return cacheObj.cache[key];
2580};
2581CacheHelper.GetCachedValue = function(obj, key, func, cacheObj) {
2582 return CacheHelper.GetCachedValueCore(obj, key, func, cacheObj, 
2583  function(obj, key, func, cacheObj) {
2584   if(!ASPx.IsExists(cacheObj.cache[key]))
2585    cacheObj.cache[key] = func.apply(obj, []);
2586  });
2587};
2588CacheHelper.GetCachedElement = function(obj, key, func, cacheObj) {
2589 return CacheHelper.GetCachedValueCore(obj, key, func, cacheObj, 
2590  function(obj, key, func, cacheObj) {
2591   if(!ASPx.IsValidElement(cacheObj.cache[key]))
2592    cacheObj.cache[key] = func.apply(obj, []);
2593  });
2594};
2595CacheHelper.GetCachedElements = function(obj, key, func, cacheObj) {
2596 return CacheHelper.GetCachedValueCore(obj, key, func, cacheObj, 
2597  function(obj, key, func, cacheObj) {
2598   if(!ASPx.IsValidElements(cacheObj.cache[key])){
2599    var elements = func.apply(obj, []);
2600    if(!Ident.IsArray(elements))
2601     elements = [elements];
2602    cacheObj.cache[key] = elements;
2603   }
2604  });
2605};
2606CacheHelper.GetCachedElementById = function(obj, id, cacheObj) {
2607 return CacheHelper.GetCachedElement(obj, id, function() { return ASPx.GetElementById(id); }, cacheObj);
2608};
2609CacheHelper.GetCachedChildById = function(obj, parent, id, cacheObj) {
2610 return CacheHelper.GetCachedElement(obj, id, function() { return ASPx.GetChildById(parent, id); }, cacheObj);
2611};
2612CacheHelper.DropCachedValue = function(cacheObj, key) {
2613 cacheObj.cache[key] = null;
2614};  
2615CacheHelper.DropCache = function(cacheObj) {
2616 cacheObj.cache = null;
2617};  
2618var DomObserver = ASPx.CreateClass(null, {
2619 constructor: function() {
2620  this.items = { };
2621 },
2622 subscribe: function(elementID, callbackFunc) {
2623  var item = this.items[elementID];
2624  if(item)
2625   this.unsubscribe(elementID);
2626  item = {
2627   elementID: elementID,
2628   callbackFunc: callbackFunc,
2629   pauseCount: 0
2630  };
2631  this.prepareItem(item);
2632  this.items[elementID] = item;
2633 },
2634 prepareItem: function(item) {
2635 },
2636 unsubscribe: function(elementID) {
2637  this.items[elementID] = null;
2638 },
2639 getItemElement: function(item) {
2640  var element = this.getElementById(item.elementID);
2641  if(element)
2642   return element;
2643  this.unsubscribe(item.elementID);
2644  return null;
2645 },
2646 getElementById: function(elementID) {
2647  var element = document.getElementById(elementID);
2648  return element && ASPx.IsValidElement(element) ? element : null;
2649 },
2650 pause: function(element, includeSubtree) {
2651  this.changeItemsState(element, includeSubtree, true);
2652 },
2653 resume: function(element, includeSubtree) {
2654  this.changeItemsState(element, includeSubtree, false);
2655 },
2656 forEachItem: function(processFunc, context) {
2657  context = context || this;
2658  for(var itemName in this.items) {
2659   if(!this.items.hasOwnProperty(itemName))
2660    continue;
2661   var item = this.items[itemName];
2662   if(item) {
2663    var needBreak = processFunc.call(context, item);
2664    if(needBreak)
2665     return;
2666   }
2667  }
2668 },
2669 changeItemsState: function(element, includeSubtree, pause) {
2670  this.forEachItem(function(item) {
2671   if(!element)
2672    this.changeItemState(item, pause);
2673   else {
2674    var itemElement = this.getItemElement(item);
2675    if(itemElement && (element == itemElement || (includeSubtree && ASPx.GetIsParent(element, itemElement)))) {
2676     this.changeItemState(item, pause);
2677     if(!includeSubtree)
2678      return true;
2679    }
2680   }
2681  }.aspxBind(this));
2682 },
2683 changeItemState: function(item, pause) {
2684  if(pause)
2685   this.pauseItem(item);
2686  else
2687   this.resumeItem(item);
2688 },
2689 pauseItem: function(item) {
2690  item.paused = true;
2691  item.pauseCount++;
2692 },
2693 resumeItem: function(item) {
2694  if(item.pauseCount > 0) {
2695   if(item.pauseCount == 1)
2696    item.paused = false;
2697   item.pauseCount--;
2698  }
2699 }
2700});
2701DomObserver.IsMutationObserverAvailable = function() {
2702 return !!window.MutationObserver;
2703};
2704var TimerObserver = ASPx.CreateClass(DomObserver, {
2705 constructor: function() {
2706  this.constructor.prototype.constructor.call(this);
2707  this.timerID = -1;
2708  this.observationTimeout = 300;
2709 },
2710 subscribe: function(elementID, callbackFunc) {
2711  DomObserver.prototype.subscribe.call(this, elementID, callbackFunc);
2712  if(!this.isActivated())
2713   this.startObserving();
2714 },
2715 isActivated: function() {
2716  return this.timerID !== -1;
2717 },
2718 startObserving: function() {
2719  if(this.isActivated())
2720   window.clearTimeout(this.timerID);
2721  this.timerID = window.setTimeout(this.onTimeout, this.observationTimeout);
2722 },
2723 onTimeout: function() {
2724  var observer = _aspxGetDomObserver();
2725  observer.doObserve();
2726  observer.startObserving();
2727 },
2728 doObserve: function() {
2729  if(!ASPx.documentLoaded) return;
2730  this.forEachItem(function(item) {
2731   if(!item.paused)
2732    this.doObserveForItem(item);
2733  }.aspxBind(this));
2734 },
2735 doObserveForItem: function(item) {
2736  var element = this.getItemElement(item);
2737  if(element)
2738   item.callbackFunc.call(this, element);
2739 }
2740});
2741var MutationObserver = ASPx.CreateClass(DomObserver, {
2742 constructor: function() {
2743  this.constructor.prototype.constructor.call(this);
2744  this.callbackTimeout = 10;
2745 },
2746 prepareItem: function(item) {
2747  item.callbackTimerID = -1;
2748  var target = this.getElementById(item.elementID);
2749  if(!target)
2750   return;
2751  var observerCallbackFunc = function() {
2752   if(item.callbackTimerID === -1) {
2753    var timeoutHander = function() {
2754     item.callbackTimerID = -1;
2755     item.callbackFunc.call(this, target);
2756    }.aspxBind(this);
2757    item.callbackTimerID = window.setTimeout(timeoutHander, this.callbackTimeout);
2758   }
2759  }.aspxBind(this);
2760  var observer = new window.MutationObserver(observerCallbackFunc);
2761  var config = { attributes: true, childList: true, characterData: true, subtree: true };
2762  observer.observe(target, config);
2763  item.observer = observer;
2764  item.config = config;
2765 },
2766 unsubscribe: function(elementID) {
2767  var item = this.items[elementID];
2768  if(item) {
2769   item.observer.disconnect();
2770   item.observer = null;
2771  }
2772  DomObserver.prototype.unsubscribe.call(this, elementID);
2773 },
2774 pauseItem: function(item) {
2775  DomObserver.prototype.pauseItem.call(this, item);
2776  item.observer.disconnect();
2777 },
2778 resumeItem: function(item) {
2779  DomObserver.prototype.resumeItem.call(this, item);
2780  if(!item.paused) {
2781   var target = this.getItemElement(item);
2782   if(target)
2783    item.observer.observe(target, item.config);
2784  }
2785 }
2786});
2787var domObserver = null;
2788function _aspxGetDomObserver() {
2789 if(domObserver == null)
2790  domObserver = DomObserver.IsMutationObserverAvailable() ? new MutationObserver() : new TimerObserver();
2791 return domObserver;
2792}
2793var ControlUpdateWatcher = ASPx.CreateClass(null, {
2794 constructor: function() {
2795  this.helpers = { };
2796  this.clearLockerTimerID = -1;
2797  this.clearLockerTimerDelay = 15;
2798  this.postProcessing = false;
2799  this.init();
2800 },
2801 init: function() {
2802  var postHandler = aspxGetPostHandler();
2803  postHandler.Post.AddHandler(this.OnPost, this);
2804 },
2805 Add: function(helper) {
2806  this.helpers[helper.GetName()] = helper;
2807 },
2808 CanSendCallback: function(dxCallbackOwner, arg) {
2809  this.LockConfirmOnBeforeWindowUnload();
2810  var modifiedHelpers = this.FilterModifiedHelpersByDXCallbackOwner(this.GetModifiedHelpers(), dxCallbackOwner, arg);
2811  if(modifiedHelpers.length === 0) return true;
2812  var modifiedHelpersInfo = this.GetToConfirmAndToResetLists(modifiedHelpers, dxCallbackOwner.name);
2813  if(!modifiedHelpersInfo) return true;
2814  if(modifiedHelpersInfo.toConfirm.length === 0) {
2815   this.ResetClientChanges(modifiedHelpersInfo.toReset);
2816   return true;
2817  }
2818  var helper = modifiedHelpersInfo.toConfirm[0];
2819  if(!confirm(helper.GetConfirmUpdateText()))
2820   return false;
2821  this.ResetClientChanges(modifiedHelpersInfo.toReset);
2822  return true;
2823 },
2824 OnPost: function(s, e) {
2825  if(this.isDxCallback(e))
2826   return;
2827  this.postProcessing = true;
2828  this.LockConfirmOnBeforeWindowUnload();
2829  var modifiedHelpersInfo = this.GetModifedHelpersInfo(e);
2830  if(!modifiedHelpersInfo)
2831   return;
2832  if(modifiedHelpersInfo.toConfirm.length === 0) {
2833   this.ResetClientChanges(modifiedHelpersInfo.toReset);
2834   return;
2835  }
2836  var helper = modifiedHelpersInfo.toConfirm[0];
2837  if(!confirm(helper.GetConfirmUpdateText())) {
2838   e.cancel = true;
2839   this.finishPostProcessing();
2840  }
2841  if(!e.cancel)
2842   this.ResetClientChanges(modifiedHelpersInfo.toReset);
2843 },
2844 isDxCallback: function(e) {
2845  return e.isDXCallback || this.isInternalUploadControlCallback();
2846 },
2847 isInternalUploadControlCallback: function() {
2848  var isInCallback = false;
2849  for(var key in this.helpers) {
2850   if(this.helpers.hasOwnProperty(key)) {
2851    var helper = this.helpers[key];
2852    isInCallback = isInCallback || helper.isInUploadCallback();
2853   }
2854  }
2855  return isInCallback;
2856 },
2857 finishPostProcessing: function() {
2858  this.postProcessing = false;
2859 },
2860 GetModifedHelpersInfo: function(e) {
2861  var modifiedHelpers = this.FilterModifiedHelpers(this.GetModifiedHelpers(), e);
2862  if(modifiedHelpers.length === 0) return;
2863  return this.GetToConfirmAndToResetLists(modifiedHelpers, e && e.ownerID);
2864 },
2865 GetToConfirmAndToResetLists: function(modifiedHelpers, ownerID) {
2866  var resetList = [ ];
2867  var confirmList = [ ];
2868  for(var i = 0; i < modifiedHelpers.length; i++) {
2869   var helper = modifiedHelpers[i];
2870   if(!helper.GetConfirmUpdateText()) { 
2871    resetList.push(helper);
2872    continue;
2873   }
2874   if(helper.CanShowConfirm(ownerID)) { 
2875    resetList.push(helper);
2876    confirmList.push(helper);
2877   }
2878  }
2879  return { toConfirm: confirmList, toReset: resetList };
2880 },
2881 FilterModifiedHelpers: function(modifiedHelpers, e) {
2882  if(modifiedHelpers.length === 0)
2883   return [ ];
2884  if(this.RequireProcessUpdatePanelCallback(e))
2885   return this.FilterModifiedHelpersByUpdatePanels(modifiedHelpers);
2886  if(this.postProcessing)
2887   return this.FilterModifiedHelpersByPostback(modifiedHelpers);
2888  return modifiedHelpers;
2889 },
2890 FilterModifiedHelpersByDXCallbackOwner: function(modifiedHelpers, dxCallbackOwner, arg) {
2891  var result = [ ];
2892  for(var i = 0; i < modifiedHelpers.length; i++) {
2893   var helper = modifiedHelpers[i];
2894   if(helper.NeedConfirmOnCallback(dxCallbackOwner, arg))
2895    result.push(helper);
2896  }
2897  return result;
2898 },
2899 FilterModifiedHelpersByUpdatePanels: function(modifiedHelpers) {
2900  var result = [ ];
2901  var updatePanels = this.GetUpdatePanelsWaitedForUpdate();
2902  for(var i = 0; i < updatePanels.length; i++) {
2903   var panelID = updatePanels[i].replace(/\$/g, "_");
2904   var panel = ASPx.GetElementById(panelID);
2905   if(!panel) continue;
2906   for(var j = 0; j < modifiedHelpers.length; j++) {
2907    var helper = modifiedHelpers[j];
2908    if(ASPx.GetIsParent(panel, helper.GetControlMainElement()))
2909     result.push(helper);
2910   }
2911  }
2912  return result;
2913 },
2914 FilterModifiedHelpersByPostback: function(modifiedHelpers) {
2915  var result = [ ];
2916  for(var i = 0; i < modifiedHelpers.length; i++) {
2917   var helper = modifiedHelpers[i];
2918   if(helper.NeedConfirmOnPostback())
2919    result.push(helper);
2920  }
2921  return result;
2922 },
2923 RequireProcessUpdatePanelCallback: function(e) {
2924  var rManager = this.GetMSRequestManager();
2925  if(rManager && e && e.isMSAjaxCallback)
2926   return rManager._postBackSettings.async;
2927  return false;
2928 },
2929 GetUpdatePanelsWaitedForUpdate: function() {
2930  var rManager = this.GetMSRequestManager();
2931  if(!rManager) return [ ];
2932  var panelUniqueIDs = rManager._postBackSettings.panelsToUpdate || [ ];
2933  var panelClientIDs = [ ];
2934  for(var i = 0; i < panelUniqueIDs.length; i++) {
2935   var index = ASPx.Data.ArrayIndexOf(rManager._updatePanelIDs, panelUniqueIDs[i]);
2936   if(index >= 0)
2937    panelClientIDs.push(rManager._updatePanelClientIDs[index]);
2938  }
2939  return panelClientIDs;
2940 },
2941 GetMSRequestManager: function() {
2942  return ASPx.GetMSAjaxRequestManager();
2943 },
2944 GetModifiedHelpers: function() {
2945  var result = [ ];
2946  for(var key in this.helpers) { 
2947   if(this.helpers.hasOwnProperty(key)) {
2948    var helper = this.helpers[key];
2949    if(helper.HasChanges())
2950     result.push(helper);
2951   }
2952  }
2953  return result;
2954 },
2955 ResetClientChanges: function(modifiedHelpers) {
2956  for(var i = 0; i < modifiedHelpers.length; i++)
2957   modifiedHelpers[i].ResetClientChanges();
2958 },
2959 GetConfirmUpdateMessage: function() {
2960  if(this.confirmOnWindowUnloadLocked) return;
2961  var modifiedHelpersInfo = this.GetModifedHelpersInfo();
2962  if(!modifiedHelpersInfo || modifiedHelpersInfo.toConfirm.length === 0) 
2963   return;
2964  var helper = modifiedHelpersInfo.toConfirm[0];
2965  return helper.GetConfirmUpdateText();
2966 },
2967 LockConfirmOnBeforeWindowUnload: function() {
2968  this.confirmOnWindowUnloadLocked = true;
2969  this.clearLockerTimerID = ASPx.Timer.ClearTimer(this.clearLockerTimerID);
2970  this.clearLockerTimerID = window.setTimeout(function() {
2971   this.confirmOnWindowUnloadLocked = false;
2972  }.aspxBind(this), this.clearLockerTimerDelay);
2973 },
2974 OnWindowBeforeUnload: function(e) {
2975  var confirmMessage = this.GetConfirmUpdateMessage();
2976  if(confirmMessage)
2977   e.returnValue = confirmMessage;
2978  this.finishPostProcessing();
2979  return confirmMessage;
2980 },
2981 OnWindowUnload: function(e) {
2982  if(this.confirmOnWindowUnloadLocked) return;
2983  var modifiedHelpersInfo = this.GetModifedHelpersInfo();
2984  if(!modifiedHelpersInfo) return;
2985  this.ResetClientChanges(modifiedHelpersInfo.toReset);
2986 },
2987 OnMouseDown: function(e) {
2988 },
2989 OnFocusIn: function(e) {
2990 },
2991 PreventBeforeUnloadOnLinkClick: function(e) {
2992  if(ASPx.GetObjectKeys(this.helpers).length == 0)
2993   return;
2994  var link = ASPx.GetParentByTagName(ASPx.Evt.GetEventSource(e), "A");
2995  if(!link || link.dxgvLinkClickHanlderAssigned)
2996   return;
2997  var url = ASPx.Attr.GetAttribute(link, "href");
2998  if(!url || url.indexOf("javascript:") < 0)
2999   return;
3000  ASPx.Evt.AttachEventToElement(link, "click", function(ev) { return ASPx.Evt.PreventEvent(ev); });
3001  link.dxgvLinkClickHanlderAssigned = true;
3002 }
3003});
3004ControlUpdateWatcher.Instance = null;
3005ControlUpdateWatcher.getInstance = function () {
3006 if (!ControlUpdateWatcher.Instance) {
3007  ControlUpdateWatcher.Instance = new ControlUpdateWatcher();
3008  ASPx.Evt.AttachEventToElement(window, "beforeunload", function(e) {
3009   return ControlUpdateWatcher.Instance.OnWindowBeforeUnload(e);
3010  });
3011  ASPx.Evt.AttachEventToElement(window, "unload", function(e) {
3012   ControlUpdateWatcher.Instance.OnWindowUnload(e);
3013  });
3014  ASPx.Evt.AttachEventToDocument("mousedown", function(e) {
3015   ControlUpdateWatcher.Instance.OnMouseDown(e);
3016  });
3017  ASPx.Evt.AttachEventToDocument("focusin", function(e) {
3018   ControlUpdateWatcher.Instance.OnFocusIn(e);
3019  });
3020 }
3021 return ControlUpdateWatcher.Instance;
3022};
3023var UpdateWatcherHelper = ASPx.CreateClass(null, {
3024 constructor: function(owner) {
3025  this.owner = owner;
3026  this.ownerWatcher = ControlUpdateWatcher.getInstance();
3027  this.ownerWatcher.Add(this);
3028 },
3029 GetName: function() {
3030  return this.owner.name;
3031 },
3032 GetControlMainElement: function() {
3033  return this.owner.GetMainElement();
3034 },
3035 GetControlParentForm: function(){
3036  return ASPx.GetParentByTagName(this.GetControlMainElement(), "FORM");
3037 },
3038 CanShowConfirm: function(requestOwnerID) {
3039  return true;
3040 },
3041 HasChanges: function() {
3042  return false;
3043 },
3044 GetConfirmUpdateText: function() {
3045  return "";
3046 },
3047 NeedConfirmOnCallback: function(dxCallbackOwner) {
3048  return true;
3049 },
3050 NeedConfirmOnPostback: function() {
3051  if(ASPx.IsUploadSubmitRequest)
3052   return !ASPx.IsUploadSubmitRequest(this.GetControlParentForm(
3052));
3053  return true;
3054 },
3055 ResetClientChanges: function() {
3056 },
3057 ConfirmOnCustomControlEvent: function() {
3058  var confirmMessage = this.GetConfirmUpdateText();
3059  if(confirmMessage)
3060   return confirm(confirmMessage);
3061  return false;
3062 },
3063 isInUploadCallback: function() {
3064  return false;
3065 }
3066});
3067var ControlTabIndexManager = ASPx.CreateClass(null, {
3068 constructor: function() {
3069  this.elementsWithChangedTabIndex = {};
3070 },
3071 getChangedElementsForControlId: function(id) {
3072  if(!this.elementsWithChangedTabIndex[id])
3073   this.elementsWithChangedTabIndex[id] = [];
3074  return this.elementsWithChangedTabIndex[id];
3075 },
3076 isElementWithChangedIndex: function(element) {
3077  for(var key in this.elementsWithChangedTabIndex)
3078   if(this.elementsWithChangedTabIndex.hasOwnProperty(key))
3079    if(this.elementsWithChangedTabIndex[key].indexOf(element) !== -1)
3080     return true;
3081  return false;
3082 },
3083 changeTabIndexAttribute: function(element, id) {
3084  var elements = this.getChangedElementsForControlId(id);
3085  ASPx.Attr.ChangeTabIndexAttribute(element);
3086  if(elements.indexOf(element) === -1)
3087   elements.push(element);
3088 },
3089 restoreTabIndexAttribute: function(element, id) {
3090  var elements = this.getChangedElementsForControlId(id),
3091   index = elements.indexOf(element);
3092  if(index !== -1) {
3093   elements.splice(index, 1);
3094   if(!this.isElementWithChangedIndex(element))
3095    ASPx.Attr.RestoreTabIndexAttribute(element);
3096  }
3097 }
3098});
3099ControlTabIndexManager.Instance = null;
3100ControlTabIndexManager.getInstance = function() {
3101 if(!ControlTabIndexManager.Instance)
3102  ControlTabIndexManager.Instance = new ControlTabIndexManager();
3103 return ControlTabIndexManager.Instance;
3104};
3105var ControlCallbackHandlersQueue = ASPx.CreateClass(null, {
3106 constructor: function (owner) {
3107  this.owner = owner;
3108  this.handlerInfos = [];
3109 },
3110 addCallbackHandler: function(handlerInfo) {
3111  this.handlerInfos.push(handlerInfo);
3112 },
3113 executeCallbacksHandlers: function() {
3114  for(var i = 0, handlerInfo; handlerInfo = this.handlerInfos[i]; i++)
3115   handlerInfo.handler.call(this.owner, handlerInfo.result);
3116  this.handlerInfos = [];
3117 }
3118});
3119var ControlCallbackQueueHelper = ASPx.CreateClass(null, {
3120 constructor: function (owner) {
3121  this.owner = owner;
3122  this.pendingCallbacks = [];
3123  this.receivedCallbacks = [];
3124  this.attachEvents();
3125 },
3126 showLoadingElements: function () {
3127  this.owner.ShowLoadingDiv();
3128  if (this.owner.IsCallbackAnimationEnabled())
3129   this.owner.StartBeginCallbackAnimation();
3130  else
3131   this.owner.ShowLoadingElementsInternal();
3132 },
3133 attachEvents: function () {
3134  this.owner.EndCallback.AddHandler(this.onEndCallback.aspxBind(this));
3135  this.owner.CallbackError.AddHandler(this.onCallbackError.aspxBind(this));
3136 },
3137 detachEvents: function () {
3138  this.owner.EndCallback.RemoveHandler(this.onEndCallback);
3139  this.owner.CallbackError.RemoveHandler(this.onCallbackError);
3140 },
3141 onCallbackError: function (owner, result) {
3142  this.sendErrorToChildControl(result);
3143 },
3144 ignoreDuplicates: function () {
3145  return true;
3146 },
3147 hasDuplicate: function (arg) {
3148  for (var i in this.pendingCallbacks) {
3149   if (this.pendingCallbacks[i].arg == arg && this.pendingCallbacks[i].state != ASPx.callbackState.aborted)
3150    return true;
3151  }
3152  return false;
3153 },
3154 getToken: function (halperContext, callbackInfo) {
3155  return {
3156   cancel: function () {
3157    if (callbackInfo.state == ASPx.callbackState.sent) {
3158     callbackInfo.state = ASPx.callbackState.aborted;
3159     halperContext.sendNext();
3160    }
3161    if (callbackInfo.state == ASPx.callbackState.inTurn)
3162     ASPx.Data.ArrayRemove(halperContext.pendingCallbacks, callbackInfo);
3163   },
3164   callbackId: -1
3165  };
3166 },
3167 sendCallback: function (arg, handlerContext, handler, commandName, onBeforeSend) {
3168  if (this.ignoreDuplicates() && this.hasDuplicate(arg))
3169   return false;
3170  var handlerContext = handlerContext || this.owner;
3171  var callbackInfo = {
3172   arg: arg,
3173   handlerContext: handlerContext,
3174   handler: handler || handlerContext.OnCallback,
3175   state: ASPx.callbackState.inTurn,
3176   callbackId: -1,
3177   onBeforeSend: onBeforeSend
3178  };
3179  this.pendingCallbacks.push(callbackInfo);
3180  if (!this.hasActiveCallback()) {
3181   this.createCallbackByCallbackInfo(callbackInfo, commandName);
3182  }
3183  return this.getToken(this, callbackInfo);
3184 },
3185 hasActiveCallback: function () {
3186  return this.getCallbacksInfoByState(ASPx.callbackState.sent).length > 0;
3187 },
3188 sendNext: function () {
3189  var nextCallbackInfo = this.getCallbacksInfoByState(ASPx.callbackState.inTurn)[0];
3190  if (nextCallbackInfo) {
3191   this.createCallbackByCallbackInfo(nextCallbackInfo);
3192   return nextCallbackInfo.callbackId;
3193  }
3194 },
3195 createCallbackByCallbackInfo: function(callbackInfo, commandName) {
3196  if(callbackInfo.onBeforeSend)
3197   callbackInfo.onBeforeSend();
3198  callbackInfo.callbackId = this.owner.CreateCallback(callbackInfo.arg, commandName);
3199  callbackInfo.state = ASPx.callbackState.sent;
3200 },
3201 onEndCallback: function () {
3202  if (!this.owner.isErrorOnCallback && this.hasPendingCallbacks()) {
3203   var curCallbackId;
3204   var curCallbackInfo;
3205   var handlerContext;
3206   for (var i in this.receivedCallbacks) {
3207    if(this.receivedCallbacks.hasOwnProperty(i)) {
3208     curCallbackId = this.receivedCallbacks[i];
3209     curCallbackInfo = this.getCallbackInfoById(curCallbackId);
3210     if (curCallbackInfo.state != ASPx.callbackState.aborted) {
3211      handlerContext = curCallbackInfo.handlerContext;
3212      if (handlerContext.OnEndCallback)
3213       handlerContext.OnEndCallback();
3214      this.sendNext();
3215     }
3216     ASPx.Data.ArrayRemove(this.pendingCallbacks, curCallbackInfo);
3217    }
3218   }
3219   ASPx.Data.ArrayClear(this.receivedCallbacks);
3220  }
3221 },
3222 hasPendingCallbacks: function () {
3223  return this.pendingCallbacks && this.pendingCallbacks.length && this.pendingCallbacks.length > 0;
3224 },
3225 processCallback: function (result, callbackId) {
3226  this.receivedCallbacks.push(callbackId);
3227  if (this.hasPendingCallbacks()) {
3228   var callbackInfo = this.getCallbackInfoById(callbackId);
3229   if (callbackInfo.state != ASPx.callbackState.aborted)
3230    callbackInfo.handler.call(callbackInfo.handlerContext, result);
3231  }
3232 },
3233 getCallbackInfoById: function (id) {
3234  for (var i in this.pendingCallbacks) {
3235   if (this.pendingCallbacks[i].callbackId == id)
3236    return this.pendingCallbacks[i];
3237  }
3238 },
3239 getCallbacksInfoByState: function (state) {
3240  var result = [];
3241  for (var i in this.pendingCallbacks) {
3242   if (this.pendingCallbacks[i].state == state)
3243    result.push(this.pendingCallbacks[i]);
3244  }
3245  return result;
3246 },
3247 sendErrorToChildControl: function (callbackObj) {
3248  if (!this.hasPendingCallbacks())
3249   return;
3250  var callbackInfo = this.getCallbackInfoById(callbackObj.callbackId || 0);
3251  if (!callbackInfo)
3252   return;
3253  var hasChildControlHandler = (callbackInfo.handlerContext != this.owner) && callbackInfo.handlerContext.OnCallbackError;
3254  if (hasChildControlHandler)
3255   callbackInfo.handlerContext.OnCallbackError.call(callbackInfo.handlerContext, callbackObj.message, callbackObj.data);
3256 }
3257});
3258var AccessibilityHelperBase = ASPx.CreateClass(null, {
3259 constructor: function(control) {
3260  this.control = control;
3261  this.pronounceMessageTimeout = 500;
3262  this.pronounceIsStarted = false;
3263  this.timerID = -1;
3264 },
3265 PronounceMessage: function(text, activeItemArgs, inactiveItemArgs, mainElementArgs, ownerMainElement) {
3266  this.timerID = ASPx.Timer.ClearTimer(this.timerID);
3267  this.pronounceIsStarted = true;
3268  this.timerID = window.setTimeout(function() {
3269   this.PronounceMessageCore(text, activeItemArgs, inactiveItemArgs, mainElementArgs, ownerMainElement);
3270  }.aspxBind(this), this.getPronounceTimeout());
3271 },
3272 PronounceMessageCore: function(text) {
3273  this.processValidationState();
3274  if(this.control.IsFocused())
3275   this.control.SendMessageToAssistiveTechnology(text);
3276 },
3277 GetActiveElement: function(inputIsMainElement) {
3278  if(this.pronounceIsStarted) return null;
3279  var mainElement = inputIsMainElement ? this.control.GetInputElement() : this.getMainElement();
3280  var activeElementId = ASPx.Attr.GetAttribute(mainElement, 'aria-activedescendant');
3281  return activeElementId ? ASPx.GetElementById(activeElementId) : mainElement;
3282 },
3283 GetPronounceElement: function() { return null; },
3284 processValidationState: function() {
3285  var errorTextElement = null;
3286  if(this.control.GetErrorCell())
3287   errorTextElement = this.getAriaExplanatoryTextManager().GetErrorTextElement();
3288  var input = this.getInputElement();
3289  var invalidArg =  { "aria-invalid": !this.control.isValid ? "true" : "" };
3290  this.changeActivityAttributes(input, invalidArg);
3291  if(errorTextElement)
3292   this.getAriaExplanatoryTextManager().SetOrRemoveText([input], errorTextElement, !this.control.isValid, false, true);
3293 },
3294 getMainElement: function() {
3295  if(!ASPx.IsExistsElement(this.mainElement))
3296   this.mainElement = this.control.GetAccessibilityAssistantElement();
3297  return this.mainElement;
3298 },
3299 changeActivityAttributes: function(element, args) {
3300  if(!element)
3301   return;
3302  for(var key in args) {
3303   if(args.hasOwnProperty(key)) {
3304    var value = args[key];
3305    if(key == "innerHtml")
3306     ASPx.SetInnerHtml(element, value);
3307    else {
3308     var action = value !== "" ? ASPx.Attr.SetAttribute : ASPx.Attr.RemoveAttribute;
3309     action(element, key, value);
3310    }
3311   }
3312  }
3313 },
3314 getPronounceTimeout: function() { return this.pronounceMessageTimeout; },
3315 getInputElement: function() { return this.control.GetInputElement(); },
3316 getAriaExplanatoryTextManager: function() { return this.control.ariaExplanatoryTextManager; }
3317});
3318var AccessibilityHelper = ASPx.CreateClass(AccessibilityHelperBase, {
3319 constructor: function(control) {
3320  this.constructor.prototype.constructor.call(this, control);
3321  this.activeItem = this.getItems()[0];
3322 },
3323 PronounceMessageCore: function(text, activeItemArgs, inactiveItemArgs, mainElementArgs, ownerMainElement) {
3324  if(!this.getItems())
3325   return;
3326  this.toogleItem();
3327  var mainElement = this.getMainElement();
3328  var activeItem = this.getItem(true);
3329  var inactiveItem = this.getItem();
3330  if(ASPx.Attr.GetAttribute(mainElement, "role") != "application")
3331   mainElementArgs = this.addArguments(mainElementArgs, { "aria-activedescendant" : activeItem.id });
3332  var messageAttrObj = {};
3333  var activeItemRole = ASPx.Attr.GetAttribute(activeItem, "role");
3334  var attrName = activeItemRole == "combobox" ? "aria-label" : "innerHtml";
3335  messageAttrObj[attrName] = ASPx.Str.EncodeHtml(text);
3336  activeItemArgs = this.addArguments(activeItemArgs, messageAttrObj);
3337  messageAttrObj[attrName] = "";
3338  inactiveItemArgs = this.addArguments(inactiveItemArgs, messageAttrObj);
3339  var errorTextElement = null;
3340  if(this.control.GetErrorCell()) {
3341   errorTextElement = this.getAriaExplanatoryTextManager().GetErrorTextElement();
3342   activeItemArgs = this.addArguments(activeItemArgs,   {"aria-invalid"  : !this.control.isValid ? "true" : "" });
3343   mainElementArgs = this.addArguments(mainElementArgs, { "aria-invalid" : "" });
3344   inactiveItemArgs = this.addArguments(inactiveItemArgs,  { "aria-invalid" : "" });
3345  }
3346  this.changeActivityAttributes(activeItem, activeItemArgs);
3347  if(errorTextElement) {
3348   this.getAriaExplanatoryTextManager().SetOrRemoveText([activeItem], errorTextElement, !this.control.isValid, false, true);
3349   this.getAriaExplanatoryTextManager().SetOrRemoveText([mainElement, inactiveItem], errorTextElement, false, false, false);
3350  }
3351  this.changeActivityAttributes(mainElement, mainElementArgs);
3352  if(!!ownerMainElement && ASPx.Attr.GetAttribute(ownerMainElement, "role") != "application")
3353   this.changeActivityAttributes(ownerMainElement, { "aria-activedescendant": activeItem.id });
3354  this.changeActivityAttributes(inactiveItem, inactiveItemArgs);
3355  this.pronounceIsStarted = false;
3356 },
3357 GetPronounceElement: function() {
3358  return this.getItem(true);
3359 },
3360 getItems: function() {
3361  if(!ASPx.IsExistsElement(this.items))
3362   this.items = ASPx.GetChildElementNodes(this.getMainElement());
3363  return this.items;
3364 },
3365 getItem: function(isActive) {
3366  if(isActive)
3367   return this.activeItem;
3368  var items = this.getItems();
3369  return items[0] === this.activeItem ? items[1] : items[0];
3370 },
3371 toogleItem: function() {
3372  this.activeItem = this.getItem();
3373 },
3374 addArguments: function(targetArgs, newArgs) {
3375  if(!targetArgs) targetArgs = { };
3376  for(var key in newArgs) {
3377   if(newArgs.hasOwnProperty(key) && !targetArgs.hasOwnProperty(key))
3378    targetArgs[key] = newArgs[key];
3379  }
3380  return targetArgs;
3381 }
3382});
3383var AccessibilityPronouncer = ASPx.CreateClass(null, {
3384 constructor: function() {
3385  this.pronouncerId = "dxPronouncer";
3386  this.initialized = false;
3387  this.focusableMessageElement = null;
3388  this.messageElement = null;
3389  this.pronouncers = {
3390   live: new AccessibilityLivePronouncer(this),
3391   descendant: new AccessibilityDescendantPronouncer(this)
3392  };
3393 },
3394 Pronounce: function(args, type) {
3395  this.pronouncers[type].Pronounce(args);
3396 },
3397 EnsureInitialize: function() {
3398  if(!this.initialized)
3399   this.initialize();
3400 },
3401 RemoveState: function() {
3402  for(var pronouncer in this.pronouncers)
3403   if(this.pronouncers.hasOwnProperty(pronouncer))
3404    pronouncer.RemoveState();
3405 },
3406 RestoreControlState: function(type, mainElement) {
3407  this.pronouncers[type].RestoreControlState(mainElement);
3408 },
3409 RestoreElementsState: function(type, elements) {
3410  this.pronouncers[type].RestoreElementsState(elements);
3411 },
3412 RestoreElementState: function(type, element) {
3413  this.pronouncers[type].RestoreElementState(element);
3414 },
3415 initialize: function() {
3416  this.createFocusableMessageElement();
3417  this.createMessageElement();
3418  this.prepareFocusableMessageElement();
3419  this.setAttributesForKeyboardNavigation();
3420  this.initialized = true;
3421 },
3422 createFocusableMessageElement: function() {
3423  var focusableMessageElement = document.createElement("DIV");
3424  document.body.appendChild(focusableMessageElement);
3425  this.focusableMessageElement = focusableMessageElement;   
3426 },
3427 prepareFocusableMessageElement: function() {
3428  this.focusableMessageElement.className = "dxAIFME";
3429 },
3430 setAttributesForKeyboardNavigation: function() {
3431  ASPx.Attr.Aria.SetApplicationRole(this.focusableMessageElement);
3432  ASPx.Attr.Aria.SetSilence(this.focusableMessageElement);
3433 },
3434 createMessageElement: function() {
3435  var messageElement = document.createElement("DIV");
3436  messageElement.id = this.pronouncerId;
3437  ASPx.Attr.SetAttribute(messageElement, "role", "note");
3438  this.focusableMessageElement.appendChild(messageElement);
3439  this.messageElement = messageElement;
3440 },
3441 getMessage: function(messagePartsArg) {
3442  var messageParts = messagePartsArg.filter(function(x) { return ASPx.IsExists(x); });
3443  return messageParts.join(", ");
3444 }
3445});
3446var AccessibilityPronouncerBase = ASPx.CreateClass(null, {
3447 constructor: function() {
3448  this.state = { };
3449 },
3450 Pronounce: function(args) {
3451  var messageElement = this.getMessageElement();
3452  ASPx.Attr.Aria.SetOrRemoveLabel(messageElement);
3453  ASPx.SetInnerHtml(messageElement, "");
3454  this.PronounceCore(args);
3455 },
3456 PronounceCore: function(args) { },
3457 SaveElementState: function(element) { 
3458  if(this.state[element.id])
3459   return;
3460  this.state[element.id] = {
3461   element: element,
3462   descendant: ASPx.Attr.GetAttribute(element, ASPx.Attr.Aria.descendant)
3463  };
3464 },
3465 RemoveState: function() {
3466  this.state = { };
3467 },
3468 RestoreControlState: function(mainElement) { 
3469  for(var elementInfo in this.state) {
3470   if(this.state.hasOwnProperty(elementInfo)) {
3471    var element = this.state[elementInfo].element;
3472    if(!mainElement || ASPx.GetIsParent(mainElement, element))
3473     this.RestoreElementState(element);
3474   }
3475  }
3476 },
3477 RestoreElementsState: function(elements) { 
3478  for(var i = 0; i < elements.length; i++)
3479   this.RestoreElementState(elements[i]);
3480 },
3481 RestoreElementState: function(element) {
3482  var elementState = this.state[element.id];
3483  if(!elementState)
3484   return;
3485  ASPx.Attr.Aria.SetOrRemoveDescendant(element, elementState.descendant);
3486  delete this.state[element.id];
3487 },
3488 getMessage: function(args) {
3489  return ASPx.AccessibilityPronouncer.getMessage(args.messageParts);
3490 },
3491 getMessageElement: function() {
3492  return ASPx.AccessibilityPronouncer.messageElement;
3493 },
3494 getFocusableMessageElement: function() {
3495   return ASPx.AccessibilityPronouncer.focusableMessageElement;
3496 }
3497});
3498var AccessibilityLivePronouncer = ASPx.CreateClass(AccessibilityPronouncerBase, {
3499 constructor: function() {
3500  this.constructor.prototype.constructor.call(this);
3501 },
3502 PronounceCore: function(args) {
3503  var message = this.getMessage(args);
3504  var messageElement = this.getMessageElement();
3505  ASPx.Attr.SetAttribute(this.getFocusableMessageElement(), "aria-live", "assertive");
3506  ASPx.Attr.Aria.SetAtomic(this.getFocusableMessageElement(), "true");
3507  ASPx.SetInnerHtml(messageElement, ASPx.Str.EncodeHtml(message));
3508 }
3509});
3510var AccessibilityDescendantPronouncer = ASPx.CreateClass(AccessibilityPronouncerBase, {
3511 constructor: function() {
3512  this.constructor.prototype.constructor.call(this);
3513 },
3514 PronounceCore: function(args) {
3515  var message = this.getMessage(args);
3516  var activeElement = ASPx.GetActiveElement();
3517  var messageElement = this.getMessageElement();
3518  this.SaveElementState(activeElement);
3519  ASPx.Attr.RemoveAttribute(this.getFocusableMessageElement(), "aria-live");
3520  ASPx.Attr.RemoveAttribute(this.getFocusableMessageElement(), "aria-atomic");
3521  ASPx.Attr.Aria.SetOrRemoveLabel(messageElement, message);
3522  ASPx.Attr.Aria.SetOrRemoveDescendant(activeElement, messageElement.id);
3523 }
3524});
3525ASPx.AccessibilityPronouncerType = {
3526 live: "live",
3527 descendant: "descendant"
3528};
3529ASPx.AccessibilityPronouncer = new AccessibilityPronouncer();
3530var RestoreFocusHelper = ASPx.CreateClass(null, {
3531 constructor: function() {
3532  this.excludedIDs = [ "DXCBtn" ]; 
3533  this.pronouncerType = ASPx.AccessibilityPronouncerType.live;
3534  this.callbackQueue = [];
3535  this.Initialize();
3536 },
3537 Initialize: function() {
3538  var that = this;
3539  ASPx.attachToLoad(function() {
3540   ASPxClientControl.GetControlCollection().BeginCallback.AddHandler(that.OnBeginCallback, that);
3541   ASPxClientControl.GetControlCollection().EndCallback.AddHandler(that.OnEndCallback, that);
3542  });
3543 },
3544 OnBeginCallback: function(s, e) {
3545  var control = e.control;
3546  if(!control.allowRestoreFocusOnCallbacks())
3547   return;
3548  control.accessibilityFocusTreeLine = this.getFocusTreeLine(control);
3549  var controlHasCallbackTreeLine = this.callbackQueueContainsTreeLine(control);
3550  this.pushTreeLineInfoIntoCallbackQueue(control);
3551  if(control.accessibilityFocusTreeLine && !controlHasCallbackTreeLine)
3552   control.SendMessageToAssistiveTechnology(this.getDefaultCallbackMessage());
3553 },
3554 OnEndCallback: function(s, e) {
3555  var control = e.control;
3556  if(!control.allowRestoreFocusOnCallbacks())
3557   return;
3558  var treeLineInfo = this.shiftTreeLineInfoFromCallbackQueue(control);
3559  if(treeLineInfo.queueLength == 0) {
3560   if(!control.accessibilityFocusTreeLine && treeLineInfo.treeLine)
3561    control.accessibilityFocusTreeLine = treeLineInfo.treeLine;
3562   var focusElement = this.findFocusElement(control);
3563   var focusIsManagerByPopupwindow = this.isFocusManagedByActivePopupWindow(focusElement);
3564   var focusIsManagedByControl = control.shouldPreventFocusRestoringOnCallback && control.shouldPreventFocusRestoringOnCallback();
3565   if(!focusIsManagerByPopupwindow && !focusIsManagedByControl)
3566    ASPx.AccessibilityUtils.SetFocusAccessible(focusElement);
3567   delete control.accessibilityFocusTreeLine;
3568  }
3569 },
3570 pushTreeLineInfoIntoCallbackQueue: function(control) {
3571  var controlTreeLine = control.accessibilityFocusTreeLine ? control.accessibilityFocusTreeLine.slice(0) : null;
3572  if(!this.callbackQueue[control.name])
3573   this.callbackQueue[control.name] = [];
3574  this.callbackQueue[control.name].push(controlTreeLine);
3575 },
3576 shiftTreeLineInfoFromCallbackQueue: function(control) {
3577  var treeLineInfo = { queueLength: 0, treeLine: null };
3578  var treeLines = this.callbackQueue[control.name];
3579  if(treeLines && treeLines.length > 0) {
3580   treeLineInfo.treeLine = treeLines.shift();
3581   var linesCount = treeLines.length;
3582   treeLineInfo.queueLength = linesCount;
3583   if(linesCount > 0 && !treeLines[0] && treeLineInfo.treeLine)
3584    treeLines[0] = treeLineInfo.treeLine.slice(0);
3585  }
3586  return treeLineInfo;
3587 },
3588 callbackQueueContainsTreeLine: function(control) {
3589  var treeLines = this.callbackQueue[control.name];
3590  if(!treeLines || treeLines.length == 0) 
3591   return false;
3592  if(treeLines[treeLines.length - 1])
3593   return true;
3594  return false;
3595 },
3596 getDefaultCallbackMessage: function() {
3597  return ASPx.AccessibilitySR.DefaultCallbackMessage;
3598 },
3599 isFocusManagedByActivePopupWindow: function(focusElement) {
3600  var popupControl = this.getActivePopupControl();
3601  if(!popupControl || popupControl.accessibleFocusElement)
3602   return false;
3603  this.initializePopupAccessibleFocusElement(popupControl, focusElement);
3604  return popupControl.setFocusOnCallback;
3605 },
3606 getActivePopupControl: function() {
3607  var activePopupWindow = ASPx.GetPopupControlCollection && ASPx.GetPopupControlCollection().GetCurrentActiveWindowElement();
3608  if(!activePopupWindow)
3609   return null;
3610  var popupInfo = ASPx.GetPopupControlCollection().GetPopupWindowFromID(activePopupWindow.id);
3611  return popupInfo.popupControl;
3612 },
3613 initializePopupAccessibleFocusElement: function(popupControl, focusElement) {
3614  if(popupControl.setFocusOnCallback)
3615   popupControl.accessibleFocusElement = focusElement;
3616  else {
3617   var parentControl = popupControl.GetParentControl();
3618   if(parentControl && parentControl.GetMainElement())
3619    popupControl.accessibleFocusElement = ASPx.FindFirstChildActionElement(parentControl.GetMainElement());
3620  }
3621 },
3622 getFocusTreeLine: function(control) {
3623  var element = ASPx.GetActiveElement();
3624  if(!ASPx.IsExistsElement(element))
3625   return null;
3626  var mainElement = control.GetMainElement();
3627  if(!ASPx.GetIsParent(mainElement, element)) {
3628   var treeInfo = this.findFocusedControlElement(mainElement, element);
3629   element = treeInfo.focusElement;
3630   mainElement = treeInfo.rootElement;
3631  }
3632  return this.getTreeLineCore(mainElement, element);
3633 },
3634 getTreeLineCore: function(mainElement, element) {
3635  if(!element) return null;
3636  treeLine = [ ];
3637  while(element) {
3638   treeLine.push({ 
3639    id: element.id,
3640    tagName: element.tagName,
3641    index: ASPx.Data.ArrayIndexOf(element.parentNode.childNodes, element)
3642   });
3643   if(element === mainElement || element === document.body)
3644    break;
3645   element = element.parentNode;
3646  }
3647  return treeLine;
3648 },
3649 findFocusedControlElement: function(mainElement, activeElement) {
3650  var element = null;
3651  var parentElement = mainElement;
3652  var focusedEditor = ASPx.IsExists(ASPx.GetFocusedEditor) ? ASPx.GetFocusedEditor() : null;
3653  if(focusedEditor && ASPx.GetIsParent(mainElement, focusedEditor.GetMainElement()))
3654   element = focusedEditor.GetFocusableInputElement();
3655  else {
3656   if(mainElement && activeElement) {
3657    var mainControl = ASPx.GetClientControlByElementID(mainElement.id);
3658    var parentControls = ASPx.GetParentClientControls(activeElement.id);
3659    for(var i = parentControls.length - 1; i > -1; i--) {   
3660     if(mainControl.name == parentControls[i].name) {
3661      element = activeElement;
3662      var rootIndex = i > 0 ? i - 1 : i;
3663      parentElement = parentControls[rootIndex].GetMainElement();
3664      if(!parentElement && parentControls[rootIndex].GetCurrentWindowElement)
3665       parentElement = parentControls[rootIndex].GetCurrentWindowElement();
3666      break;
3667     }
3668    }
3669   }
3670  }
3671  return { focusElement: element, rootElement: parentElement }; 
3672 },
3673 findFocusElement: function(control) {
3674  if(!control.accessibilityFocusTreeLine)
3675   return;
3676  var treeLine = control.accessibilityFocusTreeLine.slice(0);
3677  var focusElementParent = this.findFocusElementParentById(treeLine);
3678  if(!focusElementParent) 
3679   return;
3680  return this.findFocusElementFromDOMTree(treeLine, focusElementParent);
3681 },
3682 findFocusElementParentById: function(treeLine) {
3683  for(var i = 0; i < treeLine.length; i++) {
3684   var id = treeLine[i].id;
3685   if(!this.isValidId(id))
3686    continue;
3687   var element = document.getElementById(id);
3688   if(element) {
3689    treeLine.splice(i, treeLine.length - i);
3690    treeLine.reverse();
3691    return element;
3692   }
3693  }
3694  return null;
3695 },
3696 findFocusElementFromDOMTree: function(treeLine, focusElementParent) {
3697  var element = focusElementParent;
3698  for(var i = 0; i < treeLine.length; i++) {
3699   var info = treeLine[i];
3700   if(info.index >= element.childNodes.length) {
3701    element = element.childNodes.length > 0 ? element.childNodes[element.childNodes.length - 1] : null;
3702    return this.findNeighbourFocusElement(element, focusElementParent);
3703   }
3704   var child = element.childNodes[info.index];
3705   if(child.tagName !== info.tagName)
3706    return this.findNeighbourFocusElement(child, focusElementParent);
3707   element = child;
3708  }
3709  return element;
3710 },
3711 findNeighbourFocusElement: function(element, focusElementParent) {
3712  ASPx.ActionElementsCache.BeginUsage();
3713  var result = this.findNeighbourFocusElementCore(element, focusElementParent);
3714  ASPx.ActionElementsCache.EndUsage();
3715  return result;
3716 },
3717 findNeighbourFocusElementCore: function(element, focusElementParent) {
3718  if(!element || !element.parentNode) return null;
3719  var neighbours = element.parentNode.childNodes;
3720  var indices = this.calcLeftRightIndices(ASPx.Data.ArrayIndexOf(neighbours, element), neighbours.length);
3721  for(var i = 0; i < indices.length; i++) {
3722   var index = indices[i];
3723   var actionElement = ASPx.FindFirstChildActionElement(neighbours[index]);
3724   if(actionElement)
3725    return actionElement;
3726  }
3727  if(element === focusElementParent)
3728   return null;
3729  return this.findNeighbourFocusElement(element.parentNode, focusElementParent);
3730 },
3731 calcLeftRightIndices: function(startIndex, count) {
3732  var indices = [ ];
3733  var incSides = [ 0, 0 ];
3734  var index = startIndex;
3735  for(var i = 0; i < count; i++) {
3736   indices.push(index);
3737   var even = i % 2 === 0;
3738   var nextIndex = this.calcNextIndex(startIndex, count, incSides, even);
3739   if(nextIndex < 0)
3740    nextIndex = this.calcNextIndex(startIndex, count, incSides, !even);
3741   index = nextIndex;
3742  }
3743  return indices;
3744 },
3745 calcNextIndex: function(startIndex, count, incSides, even) {
3746  var sideIndex = even ? 0 : 1;
3747  var inc = incSides[sideIndex];
3748  inc += even ? -1 : 1;
3749  var nextIndex = startIndex + inc;
3750  if(nextIndex >= 0 && nextIndex < count) {
3751   incSides[sideIndex] = inc;
3752   return nextIndex;
3753  }
3754  return -1;
3755 },
3756 isValidId: function(id) {
3757  return id && !this.isExcludedId(id);
3758 },
3759 isExcludedId: function(id) {
3760  var result = false;
3761  for(var i = 0; i < this.excludedIDs.length; i++) {
3762   if(id.indexOf(this.excludedIDs[i]) > -1) {
3763    result = true;
3764    break;
3765   }
3766  }
3767  return result;
3768 }
3769});
3770var EventStorage = ASPx.CreateClass(null, {
3771 constructor: function() {
3772  this.bag = { };
3773 },
3774 Save: function(e, data, overwrite) {
3775  var key = this.getEventKey(e);
3776  if(this.bag.hasOwnProperty(key) && !overwrite)
3777   return;
3778  this.bag[key] = data;
3779  window.setTimeout(function() { delete this.bag[key]; }.aspxBind(this), 100);
3780 },
3781 Load: function(e) {
3782  var key = this.getEventKey(e);
3783  return this.bag[key];
3784 },
3785 getEventKey: function(e) {
3786  if(ASPx.IsExists(e.timeStamp))
3787   return e.timeStamp.toString();
3788  var eventSource = ASPx.Evt.GetEventSource(e);
3789  var type = e.type.toString();
3790  return eventSource ? type + "_" + eventSource.uniqueID.toString() : type;
3791 }
3792});
3793ASPx.RestoreFocusHelper = new RestoreFocusHelper();
3794EventStorage.Instance = null;
3795EventStorage.getInstance = function() {
3796 if(!EventStorage.Instance)
3797  EventStorage.Instance = new EventStorage();
3798 return EventStorage.Instance;
3799};
3800var GetGlobalObject = function(objectName) {
3801 var fields = objectName.split('.');
3802 var obj = window[fields[0]];
3803 for(var i = 1;
3803 obj && i < fields.length; i++) {
3804  obj = obj[fields[i]];
3805 }
3806 return obj;
3807};
3808var GetExternalScriptProcessor = function() {
3809 return ASPx.ExternalScriptProcessor ? ASPx.ExternalScriptProcessor.getInstance() : null;
3810};
3811var SAVED_WIDTH_ATTR = "data-dx-ripple-saved-width";
3812var RIPPLE_FIXED_ROW_ATTR = "data-dx-ripple-locked";
3813var READ_ONLY_COMBOBOX_MARKER_CSS_CLASS = "dxICBReadonlyMarker";
3814var ThemesWithRipple = ['Material'];
3815var RippleHelper = {
3816 rippleTargetClassName: "dxRippleTarget",
3817 rippleTargetExternalClassName: "dxRippleTargetExternal",
3818 rippleContainerClassName: "dxRippleContainer",
3819 rippleClassName: "dxRipple",
3820 touchRadius: -1,
3821 isMobileExternalRipple: null,
3822 zoom: 1,
3823 Init: function() {
3824  if(this.getIsRippleFunctionalityEnabled()) {
3825   setTimeout(function() {
3826    this.calcTouchRadius();
3827   }.aspxBind(this), 0);
3828  }
3829 },
3830 calcTouchRadius: function() {
3831  var testBlock = document.createElement("DIV");
3832  ASPx.SetStyles(testBlock, {
3833   height: "1in",
3834   width: "1in",
3835   left: "-100%",
3836   top: "-100%",
3837   position: "absolute"
3838  });
3839  document.body.appendChild(testBlock);
3840  this.touchRadius = (1.8 / 2.54) * Math.max(testBlock.offsetWidth, testBlock.offsetHeight);
3841  document.body.removeChild(testBlock);
3842 },
3843 isRippleFunctionalityEnabled: null,
3844 checkRippleFunctionality: function() {
3845  if(ASPx.Browser.Safari && ASPx.Browser.Version <= 5.1)
3846   return false;
3847  for(var i = 0; i < ThemesWithRipple.length; i++) {
3848   var firstRippleThemeElement = document.querySelector("[class*='_" + ThemesWithRipple[i] + "']");
3849   if(firstRippleThemeElement)
3850    return true;
3851  }  
3852  return false;
3853 },
3854 ReInit: function() {
3855  this.isRippleFunctionalityEnabled = null;
3856  this.Init();
3857 },
3858 onDocumentMouseDown: function(evt) {
3859  if(RippleHelper.getIsRippleFunctionalityEnabled())
3860   RippleHelper.processMouseDown(evt);
3861 },
3862 getIsRippleFunctionalityEnabled: function() {
3863  if(!ASPx.IsExists(this.isRippleFunctionalityEnabled))
3864   this.isRippleFunctionalityEnabled = this.checkRippleFunctionality();
3865  return this.isRippleFunctionalityEnabled;
3866 },
3867   createTargetInfo: function(target) {
3868  return { 
3869   x: ASPx.GetAbsoluteX(target),
3870   y: ASPx.GetAbsoluteY(target),
3871   width: target.offsetWidth,
3872   height: target.offsetHeight,
3873   classNames: ASPx.GetClassNameList(target),
3874   getTarget: function() { return target; },
3875   getRect: function() { return {x: this.x, y: this.y, width: this.width, height: this.height }; }
3876  };
3877 },
3878 createEventInfo: function(evt) {
3879  return { x: this.getEventX(evt), y: this.getEventY(evt) };
3880 },
3881 processMouseDown: function(evt) {
3882  var evtSource = ASPx.Evt.GetEventSource(evt);
3883  var rippleTarget = this.getRippleTargetElement(evtSource);
3884  if(this.needToProcessRipple(rippleTarget, evtSource))
3885   this.processRipple(this.createTargetInfo(rippleTarget), this.createEventInfo(evt));
3886 },
3887 getRippleTargetElement: function(evtSource) {
3888  if(this.hasRippleMarker(evtSource))
3889   return evtSource;
3890  if(evtSource.tagName && evtSource.tagName.toLowerCase() == "input" && ASPx.ElementContainsCssClass(evtSource, "dxTI")) {
3891   var elements = ASPx.GetChildElementNodesByPredicate(evtSource.parentNode.parentNode, function(element) {
3892    return this.hasRippleMarker(element);
3893   }.aspxBind(this));
3894   return elements && elements[0];
3895  }
3896  return ASPx.GetParent(evtSource, function(element) {
3897   return this.hasRippleMarker(element);
3898  }.aspxBind(this));
3899 },
3900 hasRippleMarker: function(element) {
3901  if(!ASPx.IsExistsElement(element))
3902   return false;
3903  var computedStyles = window.getComputedStyle(element, ":before");
3904  if(ASPx.IsExists(computedStyles)) {
3905   var content = computedStyles.getPropertyValue("content");
3906   if(content.indexOf(this.rippleTargetExternalClassName) > -1) {
3907    ASPx.AddClassNameToElement(element, this.rippleTargetExternalClassName);
3908    return true;
3909   }
3910   return content.indexOf(this.rippleTargetClassName) > -1;
3911  }
3912  return false;
3913 },
3914 needToProcessRipple: function(rippleTarget, evtSource) {
3915  if(!rippleTarget || !ASPx.AnimationUtils)
3916   return false;
3917  var isClearButton = ASPx.ElementContainsCssClass(rippleTarget, "dxeButton") && rippleTarget.id && rippleTarget.id.indexOf("B-100") !== -1;
3918  var isEmptyCalendarDay = ASPx.ElementContainsCssClass(rippleTarget, "dxeCalendarDay") && ASPx.Str.Trim(rippleTarget.textContent) == "";
3919  var isReadonly = ASPx.ElementContainsCssClass(rippleTarget, READ_ONLY_COMBOBOX_MARKER_CSS_CLASS);
3920  var tempFixDisable = ASPx.ElementContainsCssClass(rippleTarget, "dxSwitcher") && ASPx.Browser.MacOSMobilePlatform;
3921  var rippleIsForbidden = isReadonly || isClearButton || isEmptyCalendarDay || ASPx.GetParentByPartialClassName(rippleTarget, "Disabled") ||
3922   ASPx.ElementContainsCssClass(rippleTarget, "dxgvBatchEditCell") || ASPx.ElementContainsCssClass(rippleTarget, "dxcvEditForm") ||
3923   ASPx.GetParentByPartialClassName(evtSource, "dxcvFocusedCell") || tempFixDisable;
3924  return !rippleIsForbidden;
3925 },
3926 hasBothOverflow: function(style) {
3927  return style.overflow == "scroll" || style.overflow == "auto" || style.overflow == "hidden";
3928 },
3929 hasOverflowX: function(style) {
3930  return style.overflowX == "scroll" || style.overflowX == "auto" || style.overflowX == "hidden";
3931 },
3932 hasOverflowY: function(style) {
3933  return style.overflowY == "scroll" || style.overflowY == "auto" || style.overflowY == "hidden";
3934 },
3935 getExternalRippleContainerSize: function(targetRect) {
3936  if(ASPx.Browser.MobileUI) {
3937   var origTouchRadius = this.getOriginTouchRadius();
3938   if(origTouchRadius < targetRect.width || origTouchRadius < targetRect.height)
3939    origTouchRadius = Math.max(targetRect.width, targetRect.height);
3940   return {x: targetRect.x + (targetRect.width - origTouchRadius) / 2, y: targetRect.y + (targetRect.height - origTouchRadius) / 2, width: origTouchRadius, height: origTouchRadius };
3941  }
3942  var result = { x: 0, y: 0, width: 0, height: 0 };
3943  var diff = targetRect.width - targetRect.height;
3944  if(diff > 0) {
3945   result.x = targetRect.x;
3946   result.y = targetRect.y - diff / 2;
3947   result.width = targetRect.width;
3948   result.height = targetRect.width;
3949  } else {
3950   result.x = targetRect.x + diff / 2;
3951   result.y = targetRect.y;
3952   result.width = targetRect.height;
3953   result.height = targetRect.height;
3954  }
3955  return result;
3956 },
3957 getInternalContainerSize: function(targetInfo) {
3958  var parentWithOverflow = RippleHelper.getParentWithOverflow(targetInfo.getTarget());
3959  if(!ASPx.IsExists(parentWithOverflow))
3960   return targetInfo;
3961  var parentWithOverflowStyle = ASPx.GetCurrentStyle(parentWithOverflow);
3962  var bothOverflow = this.hasBothOverflow(parentWithOverflowStyle);
3963  var overflowX = this.hasOverflowX(parentWithOverflowStyle);
3964  var overflowY = this.hasOverflowY(parentWithOverflowStyle);
3965  var parentRect = {
3966   x: ASPx.GetAbsoluteX(parentWithOverflow),
3967   y: ASPx.GetAbsoluteY(parentWithOverflow),
3968   width: parentWithOverflow.offsetWidth,
3969   height: parentWithOverflow.offsetHeight
3970  };
3971  return this.getInternalContainerSizeCore(targetInfo, parentRect, bothOverflow, overflowX, overflowY);
3972 },
3973 getInternalContainerSizeCore: function(targetRect, parentRect, bothOverflow, overflowX, overflowY) {
3974  var result = {};
3975  ASPx.Data.MergeHashTables(result, targetRect);
3976  if(bothOverflow || overflowX) {
3977   result.x = targetRect.x < parentRect.x ? parentRect.x : targetRect.x;
3978   if(targetRect.x + targetRect.width > parentRect.x + parentRect.width)
3979    result.width = parentRect.x + parentRect.width - targetRect.x;
3980   if(parentRect.x > targetRect.x)
3981    result.width -= (parentRect.x - targetRect.x);
3982  }
3983  if(bothOverflow || overflowY) {
3984   result.y = targetRect.y < parentRect.y ? parentRect.y : targetRect.y;
3985   if(targetRect.y + targetRect.height > parentRect.y + parentRect.height)
3986    result.height = parentRect.y + parentRect.height - targetRect.y;
3987   if(parentRect.y > targetRect.y)
3988    result.height -= (parentRect.y - targetRect.y);
3989  }
3990  return result;
3991 },
3992 calculateRippleContainerSize: function(targetInfo, isExternalRipple) {
3993  return isExternalRipple ? this.getExternalRippleContainerSize(targetInfo) : this.getInternalContainerSize(targetInfo);
3994 },
3995 getParentWithOverflow: function(rippleTarget) {
3996  var result = ASPx.GetParent(rippleTarget, function(element) {
3997   var elementStyle = ASPx.GetCurrentStyle(element);
3998   return this.hasBothOverflow(elementStyle) || this.hasOverflowX(elementStyle) || this.hasOverflowY(elementStyle);
3999  }.aspxBind(this));
4000  return result;
4001 },
4002 getDuration: function(targetInfo) {
4003  return this.IsExternalRipple(targetInfo) || ASPx.Browser.MobileUI ? 650 : 450;
4004 },
4005 createRippleTransition: function(container, rippleElement, radius, targetInfo) {
4006  var rippleSize = 2 * radius;
4007  var transitionProperties = {
4008   width: { from: 0, to: rippleSize, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "width", unit: "px" },
4009   height: { from: 0, to: rippleSize, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "height", unit: "px" },
4010   marginLeft: { from: 0, to: -rippleSize / 2, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "marginLeft", unit: "px" },
4011   marginTop: { from: 0, to: -rippleSize / 2, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "marginTop", unit: "px" },
4012   opacity: { from: 1, to: 0.05, transition: ASPx.AnimationConstants.Transitions.RIPPLE, propName: "o
4012pacity", unit: "%" }
4013  };
4014  var rippleTransition = ASPx.AnimationUtils.createMultipleAnimationTransition(rippleElement, {
4015   transition: ASPx.AnimationConstants.Transitions.RIPPLE,
4016   duration: this.getDuration(targetInfo),
4017   needForceTransitionEndByTimerFlag: true, 
4018   onComplete: function() {
4019    this.RemoveRippleContainer(container.parentElement);
4020   }.bind(this)
4021  });
4022  rippleTransition.Start(transitionProperties);
4023 },
4024 needForceTransitionEndByTimer: function() { return true; }, 
4025 calculateRadius: function(isExternalRipple, posX, posY, containerRect) {
4026  var radius = -1;
4027  if(isExternalRipple) {
4028   if(ASPx.Browser.MobileUI)
4029    radius = this.getOriginTouchRadius() / 2;
4030   else
4031    radius = Math.max(containerRect.height, containerRect.width);
4032  } else {
4033   var width1 = posX - containerRect.x;
4034   var width2 = containerRect.width - width1;
4035   var height1 = posY - containerRect.y;
4036   var height2 = containerRect.height - height1;
4037   var rippleWidth = Math.max(width1, width2);
4038   var rippleHeight = Math.max(height1, height2);
4039   radius = Math.sqrt(Math.pow(rippleHeight, 2) + Math.pow(rippleWidth, 2));
4040  }
4041  return radius;
4042 },
4043 createRippleElement: function(container, rippleCenter) {
4044  var rippleElement = document.createElement("DIV");
4045  rippleElement.className = this.rippleClassName;
4046  container.appendChild(rippleElement);
4047  ASPxClientUtils.SetAbsoluteX(rippleElement, rippleCenter.x);
4048  ASPxClientUtils.SetAbsoluteY(rippleElement, rippleCenter.y);
4049  return rippleElement;
4050 },
4051 processRipple: function(targetInfo, eventInfo) {
4052  this.initRippleProcess();
4053  var isExternalRipple = this.IsExternalRipple(targetInfo);
4054  var rippleCenter = this.getRippleCenter(targetInfo.getRect(), eventInfo, isExternalRipple);
4055  var container = this.createRippleContainer(targetInfo, isExternalRipple);
4056  var rippleElement = this.createRippleElement(container, rippleCenter);
4057  var radius = this.calculateRadius(isExternalRipple, rippleCenter.x, rippleCenter.y, this.getElementRect(container));
4058  this.createRippleTransition(container, rippleElement, radius, targetInfo);
4059 },
4060 initRippleProcess: function() {
4061  this.isMobileExternalRipple = null;
4062  this.zoom = screen.width / window.innerWidth;
4063 },
4064 getRippleCenter: function(targetInfo, eventInfo, isExternalRipple) {
4065  var posX = 0;
4066  var posY = 0;
4067  if(isExternalRipple) {
4068   posX = targetInfo.x + targetInfo.width / 2;
4069   posY = targetInfo.y + targetInfo.height / 2;
4070  } else {
4071   posX = eventInfo.x;
4072   posY = eventInfo.y;
4073  }
4074  return {x: posX, y: posY};
4075 },
4076 createRippleContainer: function(targetInfo, isExternalRipple) {
4077  var containerParent = targetInfo.getTarget();
4078  if(!containerParent)
4079   return;
4080  var containerTagName = containerParent.tagName == "TR" ? "TD" : "DIV";
4081  var container = document.createElement(containerTagName);
4082  container.className = this.rippleContainerClassName;
4083  if(containerParent.parentNode && containerParent.tagName == "IMG")
4084   containerParent = containerParent.parentNode;
4085  if(this.isARowInFixedLayoutTable(containerParent))
4086   this.lockFixedLayoutTableSizes(containerParent);
4087  containerParent.appendChild(container);
4088  if(isExternalRipple)
4089   container.style.borderRadius = "50%";
4090  var containerRect = this.calculateRippleContainerSize(targetInfo, isExternalRipple);
4091  this.assignContainerSettings(container, containerRect);
4092  return container;
4093 },
4094 isARowInFixedLayoutTable: function(containerParent) {
4095  if(containerParent.tagName !== "TR")
4096   return false;
4097  var parentTable = this.getParentTable(containerParent);
4098  return parentTable && ASPx.GetCurrentStyle(parentTable)["table-layout"] === "fixed";
4099 },
4100 processFirstRowOfFixedTable: function(containerRow, rowAction, cellAction) {
4101  var firstRow = this.getFirstRow(containerRow);
4102  rowAction(firstRow);
4103  var cells = ASPx.Data.CollectionToArray(firstRow.cells);
4104  cells.forEach(cellAction);
4105 },
4106 getParentTable: function(element) {
4107  var parentTable = element;
4108  while(parentTable && parentTable.tagName !== "TABLE")
4109   parentTable = parentTable.parentElement;
4110  return parentTable;
4111 },
4112 lockFixedLayoutTableSizes: function(containerRow) {
4113  var firstRow = this.getFirstRow(containerRow);
4114  if(this.incLockCount(firstRow) === 1) {
4115   var cells = ASPx.Data.CollectionToArray(firstRow.cells);
4116   var widths = cells.map(function(cell) { return cell.style.width; });
4117   var computedWidths = cells.map(function(cell) {
4118    return window.getComputedStyle(cell).width;
4119   });
4120   var fixWidth = function(cell, i) {
4121    if(ASPx.Attr.IsExistsAttribute(cell, SAVED_WIDTH_ATTR))
4122     return;
4123    if(widths[i])
4124     ASPx.Attr.SetAttribute(cell, SAVED_WIDTH_ATTR, widths[i]);
4125    cell.style.width = computedWidths[i];
4126   };
4127   cells.forEach(fixWidth);
4128  }
4129 }, 
4130 unlockFixedLayoutTableSizes: function(containerRow) {
4131  var firstRow = this.getFirstRow(containerRow);   
4132  if(this.decLockCount(firstRow) === 0) {
4133   var cells = ASPx.Data.CollectionToArray(firstRow.cells);
4134   var restoreState = function(cell) {
4135    if(ASPx.Attr.IsExistsAttribute(cell, SAVED_WIDTH_ATTR)) {
4136     cell.style.width = ASPx.Attr.GetAttribute(cell, SAVED_WIDTH_ATTR);
4137     ASPx.Attr.RemoveAttribute(cell, SAVED_WIDTH_ATTR);
4138    } else {
4139     cell.style.width = null;
4140    }
4141   };
4142   cells.forEach(restoreState);
4143  }
4144 },
4145 getFirstRow: function(containerRow) { return ASPx.GetChildByTagName(containerRow.parentElement, "TR", 0); },
4146 incLockCount: function(elem) { return this.changeLockCount(elem, 1); },
4147 decLockCount: function(elem) { return this.changeLockCount(elem, -1); },
4148 changeLockCount: function(elem, diff) {
4149  var lockCounter = this.getLockCount(elem);
4150  lockCounter += diff;
4151  lockCounter = Math.max(0, lockCounter);
4152  if(lockCounter === 0)
4153   ASPx.Attr.RemoveAttribute(elem, RIPPLE_FIXED_ROW_ATTR);
4154  else
4155   ASPx.Attr.SetAttribute(elem, RIPPLE_FIXED_ROW_ATTR, lockCounter);
4156  return lockCounter;
4157 },
4158 getLockCount: function(lockElement) {
4159  var attrValue = ASPx.Attr.GetAttribute(lockElement, RIPPLE_FIXED_ROW_ATTR);
4160  return parseInt(attrValue) || 0;
4161 },
4162 assignContainerSettings: function(container, containerRect) {
4163  var properties = {
4164   height: containerRect.height,
4165   width: containerRect.width,
4166   left: ASPx.PrepareClientPosForElement(containerRect.x, container, true),
4167   top: ASPx.PrepareClientPosForElement(containerRect.y, container, false)
4168  };
4169  if(ASPx.Browser.MobileUI)
4170   ASPx.Data.MergeHashTables(properties, {marginTop: 0, marginLeft: 0 });
4171  ASPx.SetStyles(container, properties, ASPx.Browser.MobileUI);
4172 },
4173 IsExternalRipple: function(targetInfo) {
4174  var hasExternalRippleClassName = ASPx.ElementContainsCssClass(targetInfo.getTarget(), this.rippleTargetExternalClassName);
4175  if(!ASPx.Browser.MobileUI)
4176   return hasExternalRippleClassName;
4177  return hasExternalRippleClassName || this.IsMobileExternalRipple(targetInfo);
4178 },
4179 IsMobileExternalRipple: function(targetInfo) {
4180  if(this.isMobileExternalRipple == null) {
4181   var originTouchRadius = this.getOriginTouchRadius();
4182   this.isMobileExternalRipple = ASPx.Browser.MobileUI && targetInfo.width < originTouchRadius && targetInfo.height < originTouchRadius;
4183  }
4184  return this.isMobileExternalRipple;
4185 },
4186 RemoveRippleContainer: function(element) {
4187  if(!element)
4188   return;
4189  var childs = ASPx.GetChildNodesByClassName(element, this.rippleContainerClassName);
4190  var rippleContainer = childs.length > 0 ? childs[0] : null;
4191  if(rippleContainer != null) {
4192   var containerParent = rippleContainer.parentNode;
4193   containerParent.removeChild(rippleContainer);
4194   if(this.isARowInFixedLayoutTable(containerParent))
4195    this.unlockFixedLayoutTableSizes(containerParent);
4196  }
4197 },
4198 getEventX: function(evt) {
4199  return ASPxClientUtils.GetEventX(evt);
4200 },
4201 getEventY: function(evt) {
4202  return ASPxClientUtils.GetEventY(evt);
4203 },
4204 getOriginTouchRadius: function() {
4205  return this.touchRadius / this.zoom;
4206 },
4207 getElementRect: function(element) {
4208  return { x: ASPx.GetAbsoluteX(element), y: ASPx.GetAbsoluteY(element), width: element.offsetWidth, height: element.offsetHeight };
4209 }
4210};
4211var AccessibilitySR = {
4212 AddStringResources: function(stringResourcesObj) {
4213  if(stringResourcesObj) {
4214   for(var key in stringResourcesObj)
4215    if(stringResourcesObj.hasOwnProperty(key))
4216     this[key] = stringResourcesObj[key];
4217  }
4218 }
4219};
4220ASPx.OrderedMap = OrderedMap;
4221ASPx.CollectionBase = CollectionBase;
4222ASPx.FunctionIsInCallstack = _aspxFunctionIsInCallstack;
4223ASPx.RaisePostHandlerOnPost = aspxRaisePostHandlerOnPost;
4224ASPx.GetPostHandler = aspxGetPostHandler;
4225ASPx.ProcessScriptsAndLinks = _aspxProcessScriptsAndLinks;
4226ASPx.InitializeLinks = _aspxInitializeLinks;
4227ASPx.InitializeScripts = _aspxInitializeScripts;
4228ASPx.RunStartupScripts = _aspxRunStartupScripts;
4229ASPx.IsStartupScriptsRunning = _aspxIsStartupScriptsRunning;
4230ASPx.AddScriptsRestartHandler = _aspxAddScriptsRestartHandler;
4231ASPx.GetFocusedElement = _aspxGetFocusedElement;
4232ASPx.GetDomObserver = _aspxGetDomObserver;
4233ASPx.CacheHelper = CacheHelper;
4234ASPx.ControlTree = ControlTree;
4235ASPx.ControlAdjuster = ControlAdjuster;
4236ASPx.GetControlAdjuster = GetControlAdjuster;
4237ASPx.ControlCallbackHandlersQueue = ControlCallbackHandlersQueue;
4238ASPx.ResourceManager = ResourceManager;
4239ASPx.UpdateWatcherHelper = UpdateWatcherHelper;
4240ASPx.EventStorage = EventStorage;
4241ASPx.GetGlobalObject = GetGlobalObject;
4242ASPx.GetExternalScriptProcessor = GetExternalScriptProcessor;
4243ASPx.CheckBoxCheckState = CheckBoxCheckState;
4244ASPx.CheckBoxInputKey = CheckBoxInputKey;
4245ASPx.CheckableElementStateController = CheckableElementStateController;
4246ASPx.CheckableElementHelper = CheckableElementHelper;
4247ASPx.CheckBoxInternal = CheckBoxInternal;
4248ASPx.CheckBoxInternalCollection = CheckBoxInternalCollection;
4249ASPx.ControlCallbackQueueHelper = ControlCallbackQueueHelper;
4250ASPx.FocusedStyleDecoration = FocusedStyleDecoration;
4251ASPx.EditorStyleDecoration = EditorStyleDecoration;
4252ASPx.TextEditorStyleDecoration = TextEditorStyleDecoration;
4253ASPx.AccessibilitySR = AccessibilitySR;
4254ASPx.KbdHelper = KbdHelper;
4255ASPx.AccessKeysHelper = AccessKeysHelper;
4256ASPx.AccessKey = AccessKey;
4257ASPx.IFrameHelper = IFrameHelper;
4258ASPx.Ident = Ident;
4259ASPx.TouchUIHelper = TouchUIHelper;
4260ASPx.ControlUpdateWatcher = ControlUpdateWatcher;
4261ASPx.ControlTabIndexManager = ControlTabIndexManager;
4262ASPx.AccessibilityHelperBase = AccessibilityHelperBase;
4263ASPx.AccessibilityHelper = AccessibilityHelper;
4264ASPx.RippleHelper = RippleHelper;
4265ASPx.ThemesWithRipple = ThemesWithRipple;
4266ASPx.NetworkError = NetworkError;
4267window.ASPxClientEvent = ASPxClientEvent;
4268window.ASPxClientEventArgs = ASPxClientEventArgs;
4269window.ASPxClientCancelEventArgs = ASPxClientCancelEventArgs;
4270window.ASPxClientProcessingModeEventArgs = ASPxClientProcessingModeEventArgs;
4271window.ASPxClientProcessingModeCancelEventArgs = ASPxClientProcessingModeCancelEventArgs;
4272ASPx.Evt.AttachEventToDocument(TouchUIHelper.touchMouseDownEventName, RippleHelper.onDocumentMouseDown);
4273ASPx.classesScriptParsed = true;
4274})(ASPx, { GCCheckInterval: 5000 });
4275
4276(function () {
4277 IntersectionObserversManager = ASPx.CreateClass(null, {
4278  constructor: function() {
4279   this.rootElementToObserverMap = this.createMap();
4280   this.elementToHandlerMap = this.createMap();
4281   this.clearInvalidElementsInterval = null;
4282   this.clearInvalidElementsPeriod = 5000;
4283  },
4284  AddTargetElement: function(element, rootElement, visibilityChangedHandler) {
4285   this.addTargetElementCore(element, rootElement, visibilityChangedHandler);
4286  },
4287  SubscribeElemensVisibilityChangeInBrowserWindow: function (element, visibilityChangedHandler) {
4288   this.addTargetElementCore(element, null, visibilityChangedHandler);
4289  },
4290  createMap: function() {
4291   return new Map();
4292  },
4293  getObserver: function() {
4294   return IntersectionObserver;
4295  },
4296  initializeObserver: function(rootElement) {
4297   if(!this.rootElementToObserverMap.get(rootElement)) {
4298    var options = {
4299     root: rootElement,
4300     rootMargin: '-1px',
4301     threshold: 0.0 
4302    };
4303    var observerClass = this.getObserver();
4304    var observer = new observerClass(this.visibilityChanged.bind(this), options);
4305    this.rootElementToObserverMap.set(rootElement, observer);
4306   }
4307  },
4308  addTargetElementCore: function(element, rootElement, visibilityChangedHandler) {
4309   this.initializeObserver(rootElement);
4310   if(!this.isAlreadyObserved(element)) {
4311    var observer = this.rootElementToObserverMap.get(rootElement);
4312    if(observer) {
4313     observer.observe(element);
4314     this.setObservedMarker(element);
4315     this.setElementVisibilityChangedHandler(element, visibilityChangedHandler, observer);
4316     if(this.clearInvalidElementsInterval === null) {
4317      this.clearInvalidElementsInterval = setInterval(this.removeDeletedElements.bind(this), this.clearInvalidElementsPeriod);
4318     }
4319    }
4320   }
4321  },
4322  visibilityChanged: function(entries, observer) {
4323   entries.forEach(function (entry) {
4324    if(ASPx.IsExistsElement(entry.target)){
4325     var element = this.elementToHandlerMap.get(observer);
4326     if(element) {
4327      var handler = element.get(entry.target);
4328      if(handler)
4329       handler(entry.isIntersecting);
4330     }
4331    }
4332   }.bind(this));
4333  },
4334  removeDeletedElements: function() {
4335   this.elementToHandlerMap.forEach(function(elements, observer) {
4336    elements.forEach(function(handler, element) {
4337     if(!ASPx.IsExistsElement(element)) {
4338      elements.delete(element);
4339     }
4340    }.bind(this));
4341    if(elements.size === 0) {
4342     this.elementToHandlerMap.delete(observer);
4343    }
4344   }.bind(this));
4345   if(this.elementToHandlerMap.size === 0) {
4346    clearInterval(this.clearInvalidElementsInterval);
4347    this.clearInvalidElementsInterval = null;
4348   }
4349  },
4350  setElementVisibilityChangedHandler: function(element, visibilityChangedHandler, observer) {
4351   if(!this.elementToHandlerMap.get(observer))
4352    this.elementToHandlerMap.set(observer, this.createMap());
4353   var el = this.elementToHandlerMap.get(observer);
4354   if(el)
4355    el.set(element, visibilityChangedHandler);
4356  },
4357  isAlreadyObserved: function(element) {
4358   return !!element.dxObserved;
4359  },
4360  setObservedMarker: function(element) {
4361   element.dxObserved = true;
4362  },
4363  reset: function() {
4364   this.rootElementToObserverMap.forEach(function(observer, rootElement) {
4365    observer.disconnect();
4366   }.bind(this));
4367   this.rootElementToObserverMap = this.createMap();
4368   this.elementToHandlerMap = this.createMap();
4369   this.clearInvalidElementsInterval = null;
4370   this.clearInvalidElementsPeriod = 5000;
4371  }
4372 });
4373 IntersectionObserversManagerForOldBrowsers = ASPx.CreateClass(null, {
4374  SubscribeElemensVisibilityChangeInBrowserWindow: function() { }
4375 });
4376 ASPx.IntersectionObserversManager = ASPx.IntersectionObserversManager || ((typeof(IntersectionObserver) !== "undefined") ? new IntersectionObserversManager() : new IntersectionObserversManagerForOldBrowsers());
4377}
4378)(ASPx);
4379
4380(function () {
4381ASPx.StateItemsExist = false;
4382ASPx.FocusedItemKind = "FocusedStateItem";
4383ASPx.HoverItemKind = "HoverStateItem";
4384ASPx.PressedItemKind = "PressedStateItem";
4385ASPx.SelectedItemKind = "SelectedStateItem";
4386ASPx.DisabledItemKind = "DisabledStateItem";
4387ASPx.ReadOnlyItemKind = "ReadOnlyStateItem";
4388ASPx.CachedStatePrefix = "cached";
4389ASPxStateItem = ASPx.CreateClass(null, {
4390 constructor: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, kind, disableApplyingStyleToLink){
4391  this.name = name;
4392  this.classNames = classNames;
4393  this.customClassNames = [];
4394  this.resultClassNames = [];
4395  this.cssTexts = cssTexts;
4396  this.postfixes = postfixes;
4397  this.imageObjs = imageObjs;
4398  this.imagePostfixes = imagePostfixes;
4399  this.kind = kind;
4400  this.classNamePostfix = kind.substr(0, 1).toLowerCase();
4401  this.enabled = true;
4402  this.needRefreshBetweenElements = false;
4403  this.elements = null;
4404  this.images = null;
4405  this.links = [];
4406  this.colorChanged = [];
4407  this.textDecorationChanged = [];
4408  this.disableApplyingStyleToLink = !!disableApplyingStyleToLink; 
4409 },
4410 GetCssText: function(index){
4411  if(ASPx.IsExists(this.cssTexts[index]))
4412   return this.cssTexts[index];
4413  return this.cssTexts[0];
4414 },
4415 CreateStyleRule: function(index){
4416  if(this.GetCssText(index) == "") return "";
4417  var styleSheet = ASPx.GetCurrentStyleSheet();
4418  if(styleSheet)
4419   return ASPx.CreateImportantStyleRule(styleSheet, this.GetCssText(index), this.classNamePostfix);  
4420  return ""; 
4421 },
4422 GetClassName: function(index){
4423  if(ASPx.IsExists(this.classNames[index]))
4424   return this.classNames[index];
4425  return this.classNames[0];
4426 },
4427 GetResultClassName: function(index){
4428  if(!ASPx.IsExists(this.resultClassNames[index])) {
4429   if(!ASPx.IsExists(this.customClassNames[index]))
4430    this.customClassNames[index] = this.CreateStyleRule(index);
4431   if(this.GetClassName(index) != "" && this.customClassNames[index] != "")
4432    this.resultClassNames[index] = this.GetClassName(index) + " " + this.customClassNames[index];
4433   else if(this.GetClassName(index) != "")
4434    this.resultClassNames[index] = this.GetClassName(index);
4435   else if(this.customClassNames[index] != "")
4436    this.resultClassNames[index] = this.customClassNames[index];
4437   else
4438    this.resultClassNames[index] = "";
4439  }
4440  return this.resultClassNames[index];
4441 },
4442 GetElements: function(element){
4443  if(!this.elements || !ASPx.IsValidElements(this.elements)){
4444   if(this.postfixes && this.postfixes.length > 0){
4445    this.elements = [ ];
4446    var parentNode = element.parentNode;
4447    if(parentNode){
4448     for(var i = 0; i < this.postfixes.length; i++){
4449      var id = this.name + this.postfixes[i];
4450      this.elements[i] = ASPx.GetChildById(parentNode, id);
4451      if(!this.elements[i])
4452       this.elements[i] = ASPx.GetElementById(id);
4453     }
4454    }
4455   }
4456   else
4457    this.elements = [element];
4458  }
4459  return this.elements;
4460 },
4461 GetImages: function(element){
4462  if(!this.images || !ASPx.IsValidElements(this.images)){
4463   this.images = [ ];
4464   if(this.imagePostfixes && this.imagePostfixes.length > 0){
4465    var elements = this.GetElements(element);
4466    for(var i = 0; i < this.imagePostfixes.length; i++){
4467     var id = this.name + this.imagePostfixes[i];
4468     for(var j = 0; j < elements.length; j++){
4469      if(!elements[j]) continue;
4470      if(elements[j].id == id)
4471       this.images[i] = elements[j];
4472      else
4473       this.images[i] = ASPx.GetChildById(elements[j], id);
4474      if(this.images[i])
4475       break;
4476     }
4477    }
4478   }
4479  }
4480  return this.images;
4481 },
4482 Apply: function(element){
4483  if(!this.enabled) return;
4484  try{
4485   this.ApplyStyle(element);
4486   if(this.imageObjs && this.imageObjs.length > 0)
4487    this.ApplyImage(element);
4488  }
4489  catch(e){
4490  }
4491 },
4492 ApplyStyle: function(element){
4493  var elements = this.GetElements(element);
4494  for(var i = 0; i < elements.length; i++){
4495   if(!elements[i]) continue;
4496   var elementColor, elementTextDecoration;
4497   if(this.colorChanged[i] === undefined) {
4498    elementColor = window.getComputedStyle(elements[i]).color;
4499   }
4500   if(this.textDecorationChanged[i] === undefined) {
4501    elementTextDecoration = window.getComputedStyle(elements[i]).textDecoration;
4502   }
4503   if(this.GetResultClassName(i) != "") {
4504    var className = elements[i].className.replace(this.GetResultClassName(i), "");
4505    elements[i].className = ASPx.Str.Trim(className) + " " + this.GetResultClassName(i);
4506   }
4507   if(this.colorChanged[i] === undefined) {
4508    this.colorChanged[i] = window.getComputedStyle(elements[i]).color !== elementColor;
4509   }
4510   if(this.textDecorationChanged[i] === undefined) {
4511    this.textDecorationChanged[i] = window.getComputedStyle(elements[i]).textDecoration !== elementTextDecoration;
4512   }
4513   if(!ASPx.Browser.Opera || ASPx.Browser.Version >= 9)
4514    this.ApplyStyleToLinks(elements, i);
4515  }
4516 },
4517 ApplyStyleToLinks: function(elements, index){
4518  if(this.disableApplyingStyleToLink)
4519   return;
4520  if(!ASPx.IsValidElements(this.links[index]))
4521   this.links[index] = ASPx.GetNodesByTagName(elements[index], "A");
4522  for(var i = 0; i < this.links[index].length; i++)
4523   this.ApplyStyleToLinkElement(this.links[index][i], index);
4524 },
4525 ApplyStyleToLinkElement: function(link, index) {
4526  if(this.colorChanged[index])
4527   ASPx.Attr.ChangeAttributeExtended(link.style, "color", link, "saved" + this.kind + "Color", "inherit");
4528  if(this.textDecorationChanged[index])
4529   ASPx.Attr.ChangeAttributeExtended(link.style, "text-decoration", link, "saved" + this.kind + "TextDecoration", "inherit");
4530 },
4531 ApplyImage: function(element){
4532  var images = this.GetImages(element);
4533  for(var i = 0; i < images.length; i++){
4534   if(!images[i] || !this.imageObjs[i]) continue;
4535   var useSpriteImage = typeof(this.imageObjs[i]) != "string";
4536   var newUrl = "", newCssClass = "", newBackground = "";
4537   if(useSpriteImage){
4538    newUrl = ASPx.EmptyImageUrl;           
4539    if(this.imageObjs[i].spriteCssClass) 
4540     newCssClass = this.imageObjs[i].spriteCssClass;
4541    if(this.imageObjs[i].spriteBackground)
4542     newBackground = this.imageObjs[i].spriteBackground;
4543   }
4544   else{
4545    newUrl = this.imageObjs[i];
4546    if(ASPx.Attr.IsExistsAttribute(images[i].style, "background"))   
4547     newBackground = " ";
4548   }
4549   if(newUrl != "")
4550    ASPx.Attr.ChangeAttributeExtended(images[i], "src", images[i], "saved" + this.kind + "Src", newUrl);
4551   if(newCssClass != "")
4552    this.ApplyImageClassName(images[i], newCssClass);
4553   if(newBackground != ""){
4554    if(ASPx.Browser.WebKitFamily) {
4555     var savedBackground = ASPx.Attr.GetAttribute(images[i].style, "background");
4556     if(!useSpriteImage)
4557      savedBackground += " " + images[i].style["backgroundPosition"];
4558     ASPx.Attr.SetAttribute(images[i], "saved" + this.kind + "Background", savedBackground);
4559     ASPx.Attr.SetAttribute(images[i].style, "background", newBackground);
4560    }
4561    else
4562     ASPx.Attr.ChangeAttributeExtended(images[i].style, "background", images[i], "saved" + this.kind + "Background", newBackground);
4563   }     
4564  }
4565 },
4566 ApplyImageClassName: function(element, newClassName){
4567  if(ASPx.Attr.GetAttribute(element, "saved" + this.kind + "ClassName"))
4568   this.CancelImageClassName(element);
4569  var className = element.className;
4570  ASPx.Attr.SetAttribute(element, "saved" + this.kind + "ClassName", className);
4571  element.className = className + " " + newClassName;
4572 },
4573 Cancel: function(element){
4574  if(!this.enabled) return;
4575  try{  
4576   if(this.imageObjs && this.imageObjs.length > 0)
4577    this.CancelImage(element);
4578   this.CancelStyle(element);
4579  }
4580  catch(e){
4581  }
4582 },
4583 CancelStyle: function(element){
4584  var elements = this.GetElements(element);
4585  for(var i = 0; i < elements.length; i++){
4586   if(!elements[i]) continue;
4587   if(this.GetResultClassName(i) != "") {
4588    var className = ASPx.Str.Trim(elements[i].className.replace(this.GetResultClassName(i), ""));
4589    elements[i].className = className;
4590   }
4591   if(!ASPx.Browser.Opera || ASPx.Browser.Version >= 9)
4592    this.CancelStyleFromLinks(elements, i);
4593  }
4594 },
4595 CancelStyleFromLinks: function(elements, index){
4596  if(this.disableApplyingStyleToLink)
4597   return;
4598  if(!ASPx.IsValidElements(this.links[index]))
4599   this.links[index] = ASPx.GetNodesByTagName(elements[index], "A");
4600  for(var i = 0; i < this.links[index].length; i++)
4601   this.CancelStyleFromLinkElement(this.links[index][i], index);
4602 },
4603 CancelStyleFromLinkElement: function(link, index){
4604  ASPx.Attr.RestoreAttributeExtended(link.style, "color", link, "saved" + this.kind + "Color");
4605  ASPx.Attr.RestoreAttributeExtended(link.style, "text-decoration", link, "saved" + this.kind + "TextDecoration");
4606 },
4607 CancelImage: function(element){
4608  var images = this.GetImages(element);
4609  for(var i = 0; i < images.length; i++){
4610   if(!images[i] || !this.imageObjs[i]) continue;
4611   ASPx.Attr.RestoreAttributeExtended(images[i], "src", images[i], "saved" + this.kind + "Src");
4612   this.CancelImageClassName(images[i]);
4613   ASPx.Attr.RestoreAttributeExtended(images[i].style, "background", images[i], "saved" + this.kind + "Background");
4614  }
4615 },
4616 CancelImageClassName: function(element){
4617  var savedClassName = ASPx.Attr.GetAttribute(element, "saved" + this.kind + "ClassName");
4618  if(ASPx.IsExists(savedClassName)) {
4619   element.className = savedClassName;
4620   ASPx.Attr.RemoveAttribute(element, "saved" + this.kind + "ClassName");
4621  }
4622 },
4623 Clone: function(){
4624  return new ASPxStateItem(this.name, this.classNames, this.cssTexts, this.postfixes, 
4625   this.imageObjs, this.imagePostfixes, this.kind, this.disableApplyingStyleToLink);
4626 },
4627 IsChildElement: function(element){
4628  if(element != null){
4629   var elements = this.GetElements(element);
4630   for(var i = 0; i < elements.length; i++){
4631    if(!elements[i]) continue;
4632    if(ASPx.GetIsParent(elements[i], element)) 
4633     return true;
4634   }
4635  }
4636  return false;
4637 },
4638 ForceRedrawAppearance: function(element) {
4639  if(!aspxGetStateController().IsForceRedrawAppearanceLocked()) {
4640   var value = element.style.opacity;
4641   element.style.opacity = "0.7777";
4642   var dummy = element.offsetWidth;
4643   element.style.opacity = value;
4644  }
4645 }
4646});
4647ASPxClientStateEventArgs = ASPx.CreateClass(null, {
4648 constructor: function(item, element){
4649  this.item = item;
4650  this.element = element;
4651  this.toElement = null;
4652  this.fromElement = null;
4653  this.htmlEvent = null;
4654 }
4655});
4656ASPxStateController = ASPx.CreateClass(null, {
4657 constructor: function(){
4658  this.focusedItems = { };
4659  this.hoverItems = { };
4660  this.pressedItems = { };
4661  this.selectedItems = { };
4662  this.disabledItems = {};
4663  this.readOnlyItems = {};
4664  this.disabledScheme = {};
4665  this.currentFocusedElement = null;
4666  this.currentFocusedItemName = null;
4667  this.currentHoverElement = null;
4668  this.currentHoverItemName = null;
4669  this.currentPressedElement = null;
4670  this.currentPressedItemName = null;
4671  this.savedCurrentPressedElement = null;
4672  this.savedCurrentMouseMoveSrcElement = null;
4673  this.forceRedrawAppearanceLockCount = 0;
4674  this.stateItemType = ASPxStateItem;
4675  this.AfterSetFocusedState = new ASPxClientEvent();
4676  this.AfterClearFocusedState = new ASPxClientEvent();
4677  this.AfterSetHoverState = new ASPxClientEvent();
4678  this.AfterClearHoverState = new ASPxClientEvent();
4679  this.AfterSetPressedState = new ASPxClientEvent();
4680  this.AfterClearPressedState = new ASPxClientEvent();
4681  this.AfterDisabled = new ASPxClientEvent();
4682  this.AfterEnabled = new ASPxClientEvent();
4683  this.BeforeSetFocusedState = new ASPxClientEvent();
4684  this.BeforeClearFocusedState = new ASPxClientEvent();
4685  this.BeforeSetHoverState = new ASPxClientEvent();
4686  this.BeforeClearHoverState = new ASPxClientEvent();
4687  this.BeforeSetPressedState = new ASPxClientEvent();
4688  this.BeforeClearPressedState = new ASPxClientEvent();
4689  this.BeforeDisabled = new ASPxClientEvent();
4690  this.BeforeEnabled = new ASPxClientEvent();
4691  this.FocusedItemKeyDown = new ASPxClientEvent();
4692 }, 
4693 AddHoverItem: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink){
4694  this.AddItem(this.hoverItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.HoverItemKind, disableApplyingStyleToLink);
4695  this.AddItem(this.focusedItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.FocusedItemKind, disableApplyingStyleToLink);
4696 },
4697 AddPressedItem: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink){
4698  this.AddItem(this.pressedItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.PressedItemKind, disableApplyingStyleToLink);
4699 },
4700 AddSelectedItem: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink){
4701  this.AddItem(this.selectedItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.SelectedItemKind, disableApplyingStyleToLink);
4702 },
4703 AddDisabledItem: function (name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink, rootId) {
4704  this.AddItem(this.disabledItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes,
4705   ASPx.DisabledItemKind, disableApplyingStyleToLink, this.addIdToDisabledItemScheme, rootId);
4706 },
4707 AddReadOnlyItem: function(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink) {
4708  this.AddItem(this.readOnlyItems, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, ASPx.ReadOnlyItemKind, disableApplyingStyleToLink);
4709 },
4710 addIdToDisabledItemScheme: function(rootId, childId) {
4711  if (!rootId)
4712   return;
4713  if (!this.disabledScheme[rootId])
4714   this.disabledScheme[rootId] = [rootId];
4715  if (childId && (rootId != childId) && ASPx.Data.ArrayIndexOf(this.disabledScheme[rootId], childId) == -1)
4716   this.disabledScheme[rootId].push(childId);
4717 },
4718 removeIdFromDisabledItemScheme: function(rootId, childId) {
4719  if (!rootId || !this.disabledScheme[rootId])
4720   return;
4721  ASPx.Data.ArrayRemove(this.disabledScheme[rootId], childId);
4722  if (this.disabledScheme[rootId].length == 0)
4723   delete this.disabledScheme[rootId];
4724 },
4725 AddItem: function (items, name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, kind, disableApplyingStyleToLink, onAdd, rootId) {
4726  var type = this.getStateItemType();
4727  var stateItem = new type(name, classNames, cssTexts, postfixes, imageObjs, imagePostfixes, kind, disableApplyingStyleToLink);
4728  if (postfixes && postfixes.length > 0) {
4729   for (var i = 0; i < postfixes.length; i++) {
4730    items[name + postfixes[i]] = stateItem;
4731    if (onAdd)
4732     onAdd.call(this, rootId, name + postfixes[i]);
4733   }
4734  }
4735  else {
4736   if (onAdd)
4737    onAdd.call(this, rootId, name);
4738   items[name] = stateItem;
4739  }
4740  ASPx.StateItemsExist = true;
4741 },
4742 getStateItemType: function () { return this.stateItemType; },
4743 withCustomStateItemType: function (newType, callback) {
4744  this.stateItemType = newType;
4745  callback(this);
4746  this.stateItemType = ASPxStateItem;
4747 },
4748 RemoveHoverItem: function(name, postfixes){
4749  this.RemoveItem(this.hoverItems, name, postfixes);
4750  this.RemoveItem(this.focusedItems, name, postfixes);
4751 },
4752 RemovePressedItem: function(name, postfixes){
4753  this.RemoveItem(this.pressedItems, name, postfixes);
4754 },
4755 RemoveSelectedItem: function(name, postfixes){
4756  this.RemoveItem(this.selectedItems, name, postfixes);
4757 },
4758 RemoveDisabledItem: function (name, postfixes, rootId) {
4759  this.RemoveItem(this.disabledItems, name, postfixes, this.removeIdFromDisabledItemScheme, rootId);
4760 },
4761 RemoveReadOnlyItem: function(name, postfixes) {
4762  this.RemoveItem(this.readOnlyItems, name, postfixes);
4763 },
4764 RemoveItem: function (items, name, postfixes, onRemove, rootId) {
4765  if (postfixes && postfixes.length > 0) {
4766   for (var i = 0; i < postfixes.length; i++) {
4767    delete items[name + postfixes[i]];
4768    if (onRemove)
4769     onRemove.call(this, rootId, name + postfixes[i]);
4770   }
4771  }
4772  else {
4773   delete items[name];
4774   if (onRemove)
4775    onRemove.call(this, rootId, name);
4776  }
4777 },
4778 RemoveDisposedItems: function(){
4779  this.RemoveDisposedItemsByType(this.hoverItems);
4780  this.RemoveDisposedItemsByType(this.pressedItems);
4781  this.RemoveDisposedItemsByType(this.focusedItems);
4782  this.RemoveDisposedItemsByType(this.selectedItems);
4783  this.RemoveDisposedItemsByType(this.disabledItems);
4784  this.RemoveDisposedItemsByType(this.disabledScheme);
4785  this.RemoveDisposedItemsByType(this.readOnlyItems);
4786 },
4787 RemoveDisposedItemsByType: function(items){
4788  for(var key in items) {
4789   if(items.hasOwnProperty(key)) {
4790    var item = items[key];
4791    var element = document.getElementById(key);
4792    if(!element || !ASPx.IsValidElement(element))
4793     delete items[key];
4794    try {
4795     if(item && item.elements) {
4796      for(var i = 0; i < item.elements.length; i++) {
4797       if(!ASPx.IsValidElements(item.links[i]))
4798        item.links[i] = null;
4799      }
4800     }
4801    }
4802    catch(e) {
4803    }
4804   }
4805  }
4806 },
4807 GetFocusedElement: function(srcElement){
4808  return this.GetItemElement(srcElement, this.focusedItems, ASPx.FocusedItemKind);
4809 },
4810 GetHoverElement: function(srcElement){
4811  return this.GetItemElement(srcElement, this.hoverItems, ASPx.HoverItemKind);
4812 },
4813 GetPressedElement: function(srcElement){
4814  return this.GetItemElement(srcElement, this.pressedItems, ASPx.PressedItemKind);
4815 },
4816 GetSelectedElement: function(srcElement){
4817  return this.GetItemElement(srcElement, this.selectedItems, ASPx.SelectedItemKind);
4818 },
4819 GetDisabledElement: function(srcElement){
4820  return this.GetItemElement(srcElement, this.disabledItems, ASPx.DisabledItemKind);
4821 },
4822 GetReadOnlyElement: function(srcElement) {
4823  return this.GetItemElement(srcElement, this.readOnlyItems, ASPx.ReadOnlyItemKind);
4824 },
4825 GetItemElement: function(srcElement, items, kind){
4826  if(srcElement && srcElement[ASPx.CachedStatePrefix + kind]){
4827   var cachedElement = srcElement[ASPx.CachedStatePrefix + kind];
4828   if(cachedElement != ASPx.EmptyObject)
4829    return cachedElement;
4830   return null;
4831  }
4832  var element = srcElement;
4833  while(element != null) {
4834   var item = items[element.id];
4835   if(item){
4836    this.CacheItemElement(srcElement, kind, element);
4837    element[kind] = item;
4838    return element;
4839   }
4840   element = element.parentNode;
4841  }
4842  this.CacheItemElement(srcElement, kind, ASPx.EmptyObject);
4843  return null;
4844 },
4845 CacheItemElement: function(srcElement, kind, value){
4846  if(srcElement && !srcElement[ASPx.CachedStatePrefix + kind])
4847   srcElement[ASPx.CachedStatePrefix + kind] = value;
4848 },
4849 DoSetFocusedState: function(element, fromElement){
4850  var item = element[ASPx.FocusedItemKind];
4851  if(item){
4852   var args = new ASPxClientStateEventArgs(item, element);
4853   args.fromElement = fromElement;
4854   this.BeforeSetFocusedState.FireEvent(this, args);
4855   item.Apply(element);
4856   this.AfterSetFocusedState.FireEvent(this, args);
4857  }
4858 },
4859 DoClearFocusedState: function(element, toElement){
4860  var item = element[ASPx.FocusedItemKind];
4861  if(item){
4862   var args = new ASPxClientStateEventArgs(item, element);
4863   args.toElement = toElement;
4864   this.BeforeClearFocusedState.FireEvent(this, args);
4865   item.Cancel(element);
4866   this.AfterClearFocusedState.FireEvent(this, args);
4867  }
4868 },
4869 DoSetHoverState: function(element, fromElement){
4870  var item = element[ASPx.HoverItemKind];
4871  if(item){
4872   var args = new ASPxClientStateEventArgs(item, element);
4873   args.fromElement = fromElement;
4874   this.BeforeSetHoverState.FireEvent(this, args);
4875   item.Apply(element);
4876   this.AfterSetHoverState.FireEvent(this, args);
4877  }
4878 },
4879 DoClearHoverState: function(element, toElement){
4880  var item = element[ASPx.HoverItemKind];
4881  if(item){
4882   var args = new ASPxClientStateEventArgs(item, element);
4883   args.toElement = toElement;
4884   this.BeforeClearHoverState.FireEvent(this, args);
4885   item.Cancel(element);
4886   this.AfterClearHoverState.FireEvent(this, args);
4887  }
4888 },
4889 DoSetPressedState: function(element){
4890  var item = element[ASPx.PressedItemKind];
4891  if(item){
4892   var args = new ASPxClientStateEventArgs(item, element);
4893   this.BeforeSetPressedState.FireEvent(this, args);
4894   item.Apply(element);
4895   this.AfterSetPressedState.FireEvent(this, args);
4896  }
4897 },
4898 DoClearPressedState: function(element){
4899  var item = element[ASPx.PressedItemKind];
4900  if(item){
4901   var args = new ASPxClientStateEventArgs(item, element);
4902   this.BeforeClearPressedState.FireEvent(this, args);
4903   item.Cancel(element);
4904   this.AfterClearPressedState.FireEvent(this, args);
4905  }
4906 },
4907 SetCurrentFocusedElement: function(element){
4908  if(this.currentFocusedElement && !ASPx.IsValidElement(this.currentFocusedElement)){
4909   this.currentFocusedElement = null;
4910   this.currentFocusedItemName = "";
4911  }
4912  if(this.currentFocusedElement != element){
4913   var oldCurrentFocusedElement = this.currentFocusedElement;
4914   var item = (element != null) ? element[ASPx.FocusedItemKind] : null;
4915   var itemName = (item != null) ? item.name : "";
4916   if(this.currentFocusedItemName != itemName){
4917    if(this.currentHoverItemName != "")
4918     this.SetCurrentHoverElement(null);
4919    if(this.currentFocusedElement != null)
4920     this.DoClearFocusedState(this.currentFocusedElement, element);
4921    this.currentFocusedElement = element;
4922    item = (element != null) ? element[ASPx.FocusedItemKind] : null;
4923    this.currentFocusedItemName = (item != null) ? item.name : "";
4924    if(this.currentFocusedElement != null)
4925     this.DoSetFocusedState(this.currentFocusedElement, oldCurrentFocusedElement);
4926   }
4927  }
4928 },
4929 GetCurrentHoverElement: function() {
4930  return this.currentHoverElement;
4931 },
4932 SetCurrentHoverElement: function(element){
4933  if(this.currentHoverElement && !ASPx.IsValidElement(this.currentHoverElement)){
4934   this.currentHoverElement = null;
4935   this.currentHoverItemName = "";
4936  }
4937  var item = (element != null) ? element[ASPx.HoverItemKind] : null;
4938  if(item && !item.enabled) { 
4939   element = this.GetItemElement(element.parentNode, this.hoverItems, ASPx.HoverItemKind);
4940   item = (element != null) ? element[ASPx.HoverItemKind] : null;
4941  }
4942  if(this.currentHoverElement != element){
4943   var oldCurrentHoverElement = this.currentHoverElement,
4944    itemName = (item != null) ? item.name : "";
4945   if(this.currentHoverItemName != itemName || (item != null && item.needRefreshBetweenElements)){
4946    if(this.currentHoverElement != null)
4947     this.DoClearHoverState(this.currentHoverElement, element);
4948    item = (element != null) ? element[ASPx.HoverItemKind] : null;
4949    if(item == null || item.enabled){
4950     this.currentHoverElement = element;
4951     this.currentHoverItemName = (item != null) ? item.name : "";
4952     if(this.currentHoverElement != null)
4953      this.DoSetHoverState(this.currentHoverElement, oldCurrentHoverElement);
4954    }
4955   }
4956  }
4957 },
4958 SetCurrentPressedElement: function(element){
4959  if(this.currentPressedElement && !ASPx.IsValidElement(this.currentPressedElement)){
4960   this.currentPressedElement = null;
4961   this.currentPressedItemName = "";
4962  }
4963  if(this.currentPressedElement != element){
4964   if(this.currentPressedElement != null)
4965    this.DoClearPressedState(this.currentPressedElement);
4966   var item = (element != null) ? element[ASPx.PressedItemKind] : null;
4967   if(item == null || item.enabled){
4968    this.currentPressedElement = element;
4969    this.currentPressedItemName = (item != null) ? item.name : "";
4970    if(this.currentPressedElement != null)
4971     this.DoSetPressedState(this.currentPressedElement);
4972   }
4973  }
4974 },
4975 SetCurrentFocusedElementBySrcElement: function(srcElement){
4976  var element = this.GetFocusedElement(srcElement);
4977  this.SetCurrentFocusedElement(element);
4978 },
4979 SetCurrentHoverElementBySrcElement: function(srcElement){
4980  var element = this.GetHoverElement(srcElement);
4981  this.SetCurrentHoverElement(element);
4982 },
4983 SetCurrentPressedElementBySrcElement: function(srcElement){
4984  var element = this.GetPressedElement(srcElement);
4985  this.SetCurrentPressedElement(element);
4986 },
4987 SetPressedElement: function (element) {
4988  this.SetCurrentHoverElement(null);
4989  this.SetCurrentPressedElementBySrcElement(element);
4990  this.savedCurrentPressedElement = this.currentPressedElement;
4991 },
4992 SelectElement: function (element) {
4993  var item = element[ASPx.SelectedItemKind];
4994  if(item)
4995   item.Apply(element);
4996 }, 
4997 SelectElementBySrcElement: function(srcElement){
4998  var element = this.GetSelectedElement(srcElement);
4999  if(element != null) this.SelectElement(element);
5000 }, 
5001 DeselectElement: function(element){
5002  var item = element[ASPx.SelectedItemKind];
5003  if(item)
5004   item.Cancel(element);
5005 }, 
5006 DeselectElementBySrcElement: function(srcElement){
5007  var element = this.GetSelectedElement(srcElement);
5008  if(element != null) this.DeselectElement(element);
5009 },
5010 SetElementEnabled: function(element, enable){
5011  if(enable)
5012   this.EnableElement(element);
5013  else
5014   this.DisableElement(element);
5015 },
5016 SetElementReadOnly: function(element, readOnly) {
5017  var element = this.GetReadOnlyElement(element);
5018  if (element != null) {
5019   var item = element[ASPx.ReadOnlyItemKind];
5020   if(item) {
5021    if(readOnly) {
5022     if(item.name == this.currentPressedItemName)
5023      this.SetCurrentPressedElement(null);
5024     if(item.name == this.currentHoverItemName)
5025      this.SetCurrentHoverElement(null);
5026    }
5027    if(readOnly)
5028     item.Apply(element);
5029    else
5030     item.Cancel(element);
5031   }
5032  }
5033 },
5034 SetElementWithChildNodesEnabled: function (parentName, enabled) {
5035  var procFunct = (enabled ? this.EnableElement : this.DisableElement);
5036  var childItems = this.disabledScheme[parentName];
5037  if (childItems && childItems.length > 0)
5038   for (var i = 0; i < childItems.length; i++) {
5039    procFunct.call(this, document.getElementById(childItems[i]));
5040   }
5041 },
5042 DisableElement: function (element) {
5043  var element = this.GetDisabledElement(element);
5044  if(element != null) {
5045   var item = element[ASPx.DisabledItemKind];
5046   if(item){
5047    var args = new ASPxClientStateEventArgs(item, element);
5048    this.BeforeDisabled.FireEvent(this, args);
5049    if(item.name == this.currentPressedItemName)
5050     this.SetCurrentPressedElement(null);
5051    if(item.name == this.currentHoverItemName)
5052     this.SetCurrentHoverElement(null);
5053    item.Apply(element);
5054    this.SetMouseStateItemsEnabled(item.name, item.postfixes, false);
5055    this.AfterDisabled.FireEvent(this, args);
5056   }
5057  }
5058 }, 
5059 EnableElement: function(element){
5060  var element = this.GetDisabledElement(element);
5061  if(element != null) {
5062   var item = element[ASPx.DisabledItemKind];
5063   if(item){
5064    var args = new ASPxClientStateEventArgs(item, element);
5065    this.BeforeEnabled.FireEvent(this, args);
5066    item.Cancel(element);
5067    this.SetMouseStateItemsEnabled(item.name, item.postfixes, true);
5068    this.AfterEnabled.FireEvent(this, args);
5069   }
5070  }
5071 }, 
5072 SetMouseStateItemsEnabled: function(name, postfixes, enabled){   
5073  if(postfixes && postfixes.length > 0){
5074   for(var i = 0; i < postfixes.length; i ++){
5075    this.SetItemsEnabled(this.hoverItems, name + postfixes[i], enabled);
5076    this.SetItemsEnabled(this.pressedItems, name + postfixes[i], enabled);
5077    this.SetItemsEnabled(this.focusedItems, name + postfixes[i], enabled);
5078   }
5079  }
5080  else{
5081   this.SetItemsEnabled(this.hoverItems, name, enabled);
5082   this.SetItemsEnabled(this.pressedItems, name, enabled);
5083   this.SetItemsEnabled(this.focusedItems, name, enabled);
5084  }  
5085 },
5086 SetItemsEnabled: function(items, name, enabled){   
5087  if(items[name])
5088   items[name].enabled = enabled;
5089 },
5090 OnFocusMove: function(evt){
5091  var element = ASPx.Evt.GetEventSource(evt);
5092  aspxGetStateController().SetCurrentFocusedElementBySrcElement(element);
5093 },
5094 OnMouseMove: function(evt, checkElementChanged){
5095  var srcElement = ASPx.Evt.GetEventSource(evt);
5096  if(checkElementChanged && srcElement == this.savedCurrentMouseMoveSrcElement) return;
5097  this.savedCurrentMouseMoveSrcElement = srcElement;
5098  if(this.savedCurrentPressedElement == null)
5099   this.SetCurrentHoverElementBySrcElement(srcElement);
5100  else{
5101   var element = this.GetPressedElement(srcElement);
5102   if(element != this.currentPressedElement){
5103    if(element == this.savedCurrentPressedElement)
5104     this.SetCurrentPressedElement(this.savedCurrentPressedElement);
5105    else
5106     this.SetCurrentPressedElement(null);
5107   }
5108  }
5109 },
5110 OnMouseDown: function(evt){
5111  if(!ASPx.Evt.IsLeftButtonPressed(evt)) return;
5112  var srcElement = ASPx.Evt.GetEventSource(evt);
5113  this.OnMouseDownOnElement(srcElement);
5114 },
5115 OnMouseDownOnElement: function (element) {
5116  if(this.GetPressedElement(element) == null) return;
5117  this.SetPressedElement(element);
5118 },
5119 OnMouseUp: function(evt){
5120  var srcElement = ASPx.Evt.GetEventSource(evt);
5121  this.OnMouseUpOnElement(srcElement);
5122 },
5123 OnMouseUpOnElement: function(element){
5124  if(this.savedCurrentPressedElement == null) return;
5125  this.ClearSavedCurrentPressedElement();
5126  this.SetCurrentHoverElementBySrcElement(element);
5127 },
5128 OnMouseOver: function(evt){
5129  var element = ASPx.Evt.GetEventSource(evt);
5130  if(element && element.tagName == "IFRAME")
5131   this.OnMouseMove(evt, true);
5132 },
5133 OnKeyDown: function(evt){
5134  var element = this.GetFocusedElement(ASPx.Evt.GetEventSource(evt));
5135  if(element != null && element == this.currentFocusedElement) {
5136   var item = element[ASPx.FocusedItemKind];
5137   if(item){
5138    var args = new ASPxClientStateEventArgs(item, element);
5139    args.htmlEvent = evt;
5140    this.FocusedItemKeyDown.FireEvent(this, args);
5141   }
5142  }
5143 },
5144 OnKeyUpOnElement: function(evt) {
5145  if(this.savedCurrentPressedElement != null && ASPx.Evt.IsActionKeyPressed(evt))
5146   this.ClearSavedCurrentPressedElement();
5147 },
5148 OnSelectStart: function(evt){
5149  if(this.savedCurrentPressedElement) {
5150   ASPx.Selection.Clear();
5151   return false;
5152  }
5153 },
5154 ClearSavedCurrentPressedElement: function() {
5155  this.savedCurrentPressedElement = null;
5156  this.SetCurrentPressedElement(null);
5157 },
5158 ClearCache: function(srcElement, kind) {
5159  if(srcElement[ASPx.CachedStatePrefix + kind])
5160   srcElement[ASPx.CachedStatePrefix + kind] = null;
5161 },
5162 ClearElementCache: function(srcElement) {
5163  this.ClearCache(srcElement, ASPx.FocusedItemKind);
5164  this.ClearCache(srcElement, ASPx.HoverItemKind);
5165  this.ClearCache(srcElement, ASPx.PressedItemKind);
5166  this.ClearCache(srcElement, ASPx.SelectedItemKind);
5167  this.ClearCache(srcElement, ASPx.DisabledItemKind);
5168 },
5169 ClearElementCacheInContainer: function(container) {
5170  var elements = ASPx.GetNodes(container);
5171  elements.push(container);
5172  ASPx.Data.ForEach(elements, this.ClearElementCache.bind(this));
5173 },
5174 LockForceRedrawAppearance: function() {
5175  this.forceRedrawAppearanceLockCount++;
5176 },
5177 UnlockForceRedrawAppearance: function() {
5178  this.forceRedrawAppearanceLockCount--;
5179 },
5180 IsForceRedrawAppearanceLocked: function() {
5181  return this.forceRedrawAppearanceLockCount > 0;
5182 },
5183 GetHoverItem: function(srcElement) {
5184  var element = this.GetHoverElement(srcElement);
5185  return (element != null) ? element[ASPx.HoverItemKind] : null;
5186 }
5187});
5188var stateController = null;
5189function aspxGetStateController(){
5190 if(stateController == null)
5191  stateController = new ASPxStateController();
5192 return stateController;
5193}
5194function aspxAddStateItems(method, namePrefix, classes, disableApplyingStyleToLink){
5195 for(var i = 0; i < classes.length; i ++){
5196  for(var j = 0; j < classes[i][2].length; j ++) {
5197   var name = namePrefix;
5198   if(classes[i][2][j])
5199    name += "_" + classes[i][2][j];
5200   var postfixes = classes[i][3] || null;
5201   var imageObjs = (classes[i][4] && classes[i][4][j]) || null;
5202   var imagePostfixes = classes[i][5] || null;
5203   method.call(aspxGetStateController(), name, classes[i][0], classes[i][1], postfixes, imageObjs, imagePostfixes, disableApplyingStyleToLink, namePrefix);
5204  }
5205 }
5206}
5207ASPx.AddHoverItems = function(namePrefix, classes, disableApplyingStyleToLink){
5208 aspxAddStateItems(aspxGetStateController().AddHoverItem, namePrefix, classes, disableApplyingStyleToLink);
5209};
5210ASPx.AddPressedItems = function(namePrefix, classes, disableApplyingStyleToLink){
5211 aspxAddStateItems(aspxGetStateController().AddPressedItem, namePrefix, classes, disableApplyingStyleToLink);
5212};
5213ASPx.AddSelectedItems = function(namePrefix, classes, disableApplyingStyleToLink){
5214 aspxAddStateItems(aspxGetStateController().AddSelectedItem, namePrefix, classes, disableApplyingStyleToLink);
5215};
5216ASPx.AddDisabledItems = function(namePrefix, classes, disableApplyingStyleToLink){
5217 aspxAddStateItems(aspxGetStateController().AddDisabledItem, namePrefix, classes, disableApplyingStyleToLink);
5218};
5219ASPx.AddReadOnlyItems = function(namePrefix, classes, disableApplyingStyleToLink) {
5220 aspxAddStateItems(aspxGetStateController().AddReadOnlyItem, namePrefix, classes, disableApplyingStyleToLink);
5221};
5222function aspxRemoveStateItems(method, namePrefix, classes){
5223 for(var i = 0; i < classes.length; i ++){
5224  for(var j = 0; j < classes[i][0].length; j ++) {
5225   var name = namePrefix;
5226   if(classes[i][0][j])
5227    name += "_" + classes[i][0][j];
5228   method.call(aspxGetStateController(), name, classes[i][1], namePrefix);
5229  }
5230 }
5231}
5232ASPx.RemoveHoverItems = function(namePrefix, classes){
5233 aspxRemoveStateItems(aspxGetStateController().RemoveHoverItem, namePrefix, classes);
5234};
5235ASPx.RemovePressedItems = function(namePrefix, classes){
5236 aspxRemoveStateItems(aspxGetStateController().RemovePressedItem, namePrefix, classes);
5237};
5238ASPx.RemoveSelectedItems = function(namePrefix, classes){
5239 aspxRemoveStateItems(aspxGetStateController().RemoveSelectedItem, namePrefix, classes);
5240};
5241ASPx.RemoveDisabledItems = function(namePrefix, classes){
5242 aspxRemoveStateItems(aspxGetStateController().RemoveDisabledItem, namePrefix, classes);
5243};
5244ASPx.RemoveReadOnlyItems = function(namePrefix, classes) {
5245 aspxRemoveStateItems(aspxGetStateController().RemoveReadOnlyItem, namePrefix, classes);
5246};
5247ASPx.AddAfterClearFocusedState = function(handler){
5248 aspxGetStateController().AfterClearFocusedState.AddHandler(handler);
5249};
5250ASPx.AddAfterSetFocusedState = function(handler){
5251 aspxGetStateController().AfterSetFocusedState.AddHandler(handler);
5252};
5253ASPx.AddAfterClearHoverState = function(handler){
5254 aspxGetStateController().AfterClearHoverState.AddHandler(handler);
5255};
5256ASPx.AddAfterSetHoverState = function(handler){
5257 aspxGetStateController().AfterSetHoverState.AddHandler(handler);
5258};
5259ASPx.AddAfterClearPressedState = function(handler){
5260 aspxGetStateController().AfterClearPressedState.AddHandler(handler);
5261};
5262ASPx.AddAfterSetPressedState = function(handler){
5263 aspxGetStateController().AfterSetPressedState.AddHandler(handler);
5264};
5265ASPx.AddAfterDisabled = function(handler){
5266 aspxGetStateController().AfterDisabled.AddHandler(handler);
5267};
5268ASPx.AddAfterEnabled = function(handler){
5269 aspxGetStateController().AfterEnabled.AddHandler(handler);
5270};
5271ASPx.AddBeforeClearFocusedState = function(handler){
5272 aspxGetStateController().BeforeClearFocusedState.AddHandler(handler);
5273};
5274ASPx.AddBeforeSetFocusedState = function(handler){
5275 aspxGetStateController().BeforeSetFocusedState.AddHandler(handler);
5276};
5277ASPx.AddBeforeClearHoverState = function(handler){
5278 aspxGetStateController().BeforeClearHoverState.AddHandler(handler);
5279};
5280ASPx.AddBeforeSetHoverState = function(handler){
5281 aspxGetStateController().BeforeSetHoverState.AddHandler(handler);
5282};
5283ASPx.AddBeforeClearPressedState = function(handler){
5284 aspxGetStateController().BeforeClearPressedState.AddHandler(handler);
5285};
5286ASPx.AddBeforeSetPressedState = function(handler){
5287 aspxGetStateController().BeforeSetPressedState.AddHandler(handler);
5288};
5289ASPx.AddBeforeDisabled = function(handler){
5290 aspxGetStateController().BeforeDisabled.AddHandler(handler);
5291};
5292ASPx.AddBeforeEnabled = function(handler){
5293 aspxGetStateController().BeforeEnabled.AddHandler(handler);
5294};
5295ASPx.AddFocusedItemKeyDown = function(handler){
5296 aspxGetStateController().FocusedItemKeyDown.AddHandler(handler);
5297};
5298ASPx.SetHoverState = function(element){
5299 aspxGetStateController().SetCurrentHoverElementBySrcElement(element);
5300};
5301ASPx.ClearHoverState = function(evt){
5302 aspxGetStateController().SetCurrentHoverElementBySrcElement(null);
5303};
5304ASPx.UpdateHoverState = function(evt){
5305 aspxGetStateController().OnMouseMove(evt, false);
5306};
5307ASPx.SetFocusedState = function(element){
5308 aspxGetStateController().SetCurrentFocusedElementBySrcElement(element);
5309};
5310ASPx.ClearFocusedState = function(evt){
5311 aspxGetStateController().SetCurrentFocusedElementBySrcElement(null);
5312};
5313ASPx.UpdateFocusedState = function(evt){
5314 aspxGetStateController().OnFocusMove(evt);
5315};
5316ASPx.AccessibilityMarkerClass = "dxalink";
5317ASPx.AssignAccessibilityEventsToChildrenLinks = function(container, clearFocusedStateOnMouseOut){
5318 var links = ASPx.GetNodesByPartialClassName(container, ASPx.AccessibilityMarkerClass);
5319 for(var i = 0; i < links.length; i++)
5320  ASPx.AssignAccessibilityEventsToLink(links[i], clearFocusedStateOnMouseOut);
5321};
5322ASPx.AssignAccessibilityEventsToLink = function(link, clearFocusedStateOnMouseOut) {
5323 if(!ASPx.ElementContainsCssClass(link, ASPx.AccessibilityMarkerClass))
5324  return;
5325 ASPx.AssignAccessibilityEventsToLinkCore(link, clearFocusedStateOnMouseOut);
5326};
5327ASPx.AssignAccessibilityEventsToLinkCore = function (link, clearFocusedStateOnMouseOut) {
5328 ASPx.Evt.AttachEventToElement(link, "focus", function (e) { ASPx.UpdateFocusedState(e); });
5329 var clearFocusedStateHandler = function (e) { ASPx.ClearFocusedState(e); };
5330 ASPx.Evt.AttachEventToElement(link, "blur", clearFocusedStateHandler);
5331 if(clearFocusedStateOnMouseOut)
5332  ASPx.Evt.AttachEventToElement(link, "mouseout", clearFocusedStateHandler);
5333};
5334ASPx.Evt.AttachEventToDocument("mousemove", function(evt) {
5335 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
5336  aspxGetStateController().OnMouseMove(evt, true);
5337});
5338ASPx.Evt.AttachEventToDocument(ASPx.TouchUIHelper.touchMouseDownEventName, function(evt) {
5339 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
5340  aspxGetStateController().OnMouseDown(evt);
5341});
5342ASPx.Evt.AttachEventToDocument(ASPx.TouchUIHelper.touchMouseUpEventName, function(evt) {
5343 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
5344  aspxGetStateController().OnMouseUp(evt);
5345});
5346ASPx.Evt.AttachEventToDocument("mouseover", function(evt) {
5347 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
5348  aspxGetStateController().OnMouseOver(evt);
5349});
5350ASPx.Evt.AttachEventToDocument("keydown", function(evt) {
5351 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
5352  aspxGetStateController().OnKeyDown(evt);
5353});
5354ASPx.Evt.AttachEventToDocument("selectstart", function(evt) {
5355 if(ASPx.classesScriptParsed && ASPx.StateItemsExist)
5356  return aspxGetStateController().OnSelectStart(evt);
5357});
5358ASPx.GetStateController = aspxGetStateController;
5359ASPx.StateItem = ASPxStateItem;
5360})();
5361
5362},0);

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.