var __aspxTINonProcessingSymbols = ["^", "\\", "\'"];
var __aspxTIWildCards = ["*", "?"];
var __aspxTIGroupElementClassName = "dxg";
var __aspxTIItemElementClassName = "dxtxi";
var __aspxTITextElementClassName = "dxtxt";
var __aspxTIDefaultFilterIntervalDelay = 200;
ASPxClientTitleIndex = _aspxCreateClass(ASPxClientControl, {
 constructor: function(name){
  this.constructor.prototype.constructor.call(this, name);
  this.allowMultipleCallbacks = false;
  this.autoFocus = false;
  this.columnCount = 1;
  this.filterDelay = 0;
  this.rowCount = -1;
  this.showBackToTop = false;
  this.softFiltering = false;
  this.groupSpacing = 0;
  this.groupContentPaddingBottom = 0;
  this.groupContentPaddingTop = 0;
  this.lastFilterMask = "";  
  this.pasteTimerID = -1;
  this.filterTimerID = -1;
  this.mainCellWidth = 0;
  this.columnElements = new Object();    
  this.groupElements = new Object();
  this.itemElements = new Object();
  this.ItemClick = new ASPxClientEvent();
  this.InitializeAutoComplete();
 },
 Initialize: function(){
  if (_aspxIsExists(this.GetFilterInputElement())) {
   this.CleanWhitespaceInControl();
   if (this.filterDelay > __aspxTIDefaultFilterIntervalDelay)
    __aspxTIDefaultFilterIntervalDelay = this.filterDelay;
  }
  if (this.autoFocus && _aspxIsExists(this.GetFilterInputElement()) && 
      _aspxIsFocusable(this.GetFilterInputElement()))
   this.GetFilterInputElement().focus();
  this.constructor.prototype.Initialize.call(this);
 },
 InitializeAutoComplete: function(){
  var element = this.GetFilterInputElement();
  if (_aspxIsExists(element)) element.autocomplete = "off";
 },
 GetCategoryHeaderElement: function(rowIndex){
  return this.GetChild("_CH" + rowIndex);
 },
 GetColumnElement: function(index, rowIndex){
  var columnId = (this.rowCount > 0) ? "_C" + index + "_" + rowIndex : "_C" + index;
  if(!_aspxIsExistsElement(this.columnElements[columnId]))
   this.columnElements[columnId] = this.GetChild(columnId);
  return this.columnElements[columnId];
 },
 GetContentTDWidth: function() {
  return _aspxGetParentByTagName(this.GetCategoryHeaderElement(0), 'td').clientWidth;  
 },
 GetEmptyResultCaptionElement: function() {
  return this.GetChild("_TI_E");
 },
 GetFilterInputElement: function() {
  return this.GetChild("_FI");
 },
 GetGroupElements: function(columnElement) { 
  if(!_aspxIsValidElements(this.groupElements[columnElement.id]))
   this.groupElements[columnElement.id] = _aspxGetChildsByClassName(columnElement, __aspxTIGroupElementClassName);
  return this.groupElements[columnElement.id];
 },
 GetItemText: function(nodeElement) {
  var textElem = this.GetItemTextElement(nodeElement);
  if (_aspxIsExists(textElem) && _aspxIsExists(textElem.nodeValue))
   return _aspxTrim(textElem.nodeValue);
  else  
   return "";
 },
 GetItemElements: function(groupElement) {
  var groupText = this.GetItemText(groupElement);
  if(!_aspxIsValidElements(this.itemElements[groupText]))
   this.itemElements[groupText] = _aspxGetChildsByClassName(groupElement, __aspxTIItemElementClassName);
  return this.itemElements[groupText];
 },
 GetItemTextElement: function(nodeElement){ 
  var textElement = _aspxGetChildsByClassName(nodeElement, __aspxTITextElementClassName)[0];
  return _aspxIsExists(textElement) ? _aspxGetChildTextNode(textElement, 0) : null;
 },
 GetIndexPanelIndexInputElement: function(){
  return _aspxGetElementById(this.name + "PI");
 },
 GetContentCell: function(){
  return this.GetChild("_CCell");
 }, 
 GetTreeViewCell: function(){
  return this.GetChild("_ICell");
 },
 SetPrevFilterMask: function(filterMask) {
  if(!_aspxIsExists(this.lastFilterMask))
    this.lastFilterMask = "";
  this.lastFilterMask = filterMask; 
 },  
 SetFilterTimer: function(fi, timeout) {
  var str = "aspxSFilterTimer(\"" + this.name + "\")";
  if(timeout == 0)
   eval(str);
  else
   this.filterTimerID = _aspxSetTimeout(str, timeout);
 },
 SetPasteTimer: function() {
  var str = "aspxSPasteTimer(\"" + this.name + "\")";
  this.pasteTimerID = _aspxSetInterval(str, __aspxTIDefaultFilterIntervalDelay);
 },
 ClearFilterTimer: function() {
  this.filterTimerID = _aspxClearTimer(this.filterTimerID);
 },
 ClearPasteTimer: function() {
  this.pasteTimerID = _aspxClearInterval(this.pasteTimerID);
 },
 CleanWhitespaceInControl: function() {
  if (this.rowCount > 0)
   this.CleanWhitespace(_aspxGetParentByTagName(this.GetCategoryHeaderElement(0), "table"));
  else {
     for (var j = 0; j < this.columnCount; j ++)
     this.CleanWhitespace(this.GetColumnElement(j, -1));
  }
 },
 CleanWhitespace: function(element) {
  if (element.hasChildNodes()) {   
   var i = 0;
   while (i < element.childNodes.length) {
    var node = element.childNodes[i];
    if(node.nodeType == 3 && !/\S/.test(node.nodeValue))
     node.parentNode.removeChild(node);
    else{
     i++;
     if(node.nodeType != 3)
      this.CleanWhitespace(node);
    }
    }
  }
 },
 CreateFilterRegEx: function(filterMask) {
  var regExString = (this.softFiltering) ? ".*" : "^";
  for (var i=0; i<filterMask.length; i++){
   var index = _aspxArrayIndexOf(__aspxTIWildCards, filterMask.charAt(i));
   if (index > -1){
    switch(index) {
     case 0: regExString += ".*"; break; 
     case 1: regExString += ".{1}"; break; 
    }
   }
   else {
    var index = _aspxArrayIndexOf(__aspxTINonProcessingSymbols, filterMask.charAt(i));
    if (index == -1)
     regExString += "[" + filterMask.charAt(i) + "]";
   }
  }
  regExString += ".*";
  return new RegExp(regExString, 'i'); 
 }, 
 OnCallback: function(result) {
  var inputElement = this.GetIndexPanelIndexInputElement();
  if(inputElement != null) 
   inputElement.value = result.index;
  var element = this.GetContentCell();
  if(element != null) 
   _aspxSetInnerHtml(element, result.html);
 },
 IsAllowableKeyCode: function(keyCode) {
  return (((keyCode >= 48) && (keyCode <= 57)) || 
    ((keyCode >= 186) && (keyCode <= 192)) || 
    ((keyCode >= 219) && (keyCode <= 226)) || 
    ((keyCode >= 65)&&(keyCode <= 90)) ||
    ((keyCode >= 65)&&(keyCode <= 90)) || 
    ((keyCode >= 96)&&(keyCode <= 107)) || 
    ((keyCode >= 109)&&(keyCode <= 111)) || 
      keyCode == 8 || keyCode == 45 || keyCode == 46);
 },
 IsFirstCategoryTR: function(categoryElem) {
  var spacingElem = categoryElem.parentNode.previousSibling;
  return !_aspxIsExists(spacingElem);
 },
 IsFirstCategory: function(categoryElem, index) {
  var i = index - 1;
  while (i >= 0) {  
   if (_aspxGetElementDisplay(this.GetCategoryHeaderElement(i).parentNode))
    return false;
   i--;
  }
  return true;
 },
 IsFirstGroupInColumn: function(groupIndex, columnElem) {
  var groupElements = this.GetGroupElements(columnElem);  
  var i = groupIndex - 1;
  while (i >= 0) {
   if (_aspxGetElementDisplay(groupElements[i]))
    return false;
   i--;
  }
  return true; 
 }, 
 IsFilterTimerActive: function() {
  return this.filterTimerID > -1;
 },
 IsFilterMaskChanged: function(filterMask) {
  if(!_aspxIsExists(this.lastFilterMask))
   this.lastFilterMask = "";
   return this.lastFilterMask.toUpperCase() != filterMask.toUpperCase();
 },
 CorrectCategorySpacing: function(categoryElem, index) {
  var headerTR = categoryElem.parentNode;  
  if (!this.IsFirstCategoryTR(categoryElem) && 
   (this.groupSpacing != 0) &&  this.IsFirstCategory(categoryElem, index))   
   _aspxSetElementDisplay(headerTR.previousSibling, false);
 },
 CorrectNodesPaddings: function(columnIndex, rowIndex) {
  var columnElem = this.GetColumnElement(columnIndex, rowIndex);
  var groupElements = this.GetGroupElements(columnElem);  
  for (var i = 0; i < groupElements.length; i ++) {
   if (_aspxGetElementDisplay(groupElements[i])) {     
    if (this.IsFirstGroupInColumn(i, columnElem)) 
     _aspxChangeStyleAttribute(groupElements[i], "paddingTop", 0);
    else 
     _aspxRestoreStyleAttribute(groupElements[i], "paddingTop");
    this.CorrectGroupContentPadding(groupElements[i]);
   }
  }
 },
 CorrectGroupContentPadding: function(groupElement) {
  var itemElements = this.GetItemElements(groupElement);  
  for (var i = 0; i < itemElements.length; i++) {
   if (_aspxGetElementDisplay(itemElements[i])) {
    if (i == 0)  
     _aspxChangeStyleAttribute(itemElements[i], "paddingTop", 0);
    else 
     _aspxRestoreStyleAttribute(itemElements[i], "paddingTop");
   }
  }
 },
 DoIndexPanelItemClick: function(value) {
  var inputElement = this.GetIndexPanelIndexInputElement();
  if(inputElement != null) {
   if (_aspxIsExists(this.GetFilterInputElement()))
    this.GetFilterInputElement().disabled = true;
   this.CreateCallback(value + __aspxCallbackSeparator + value);
  }
 },
 DoBeginCallback: function(command){
  this.CreateLoadingPanelWithAbsolutePosition(this.GetTreeViewCell());
  ASPxClientControl.prototype.DoBeginCallback.call(this, command);
 },
 OnControlClick: function(clickedElement, htmlEvent) {
  var itemElement = _aspxGetParentByClassName(clickedElement, __aspxItemClassName);  
  if(_aspxIsExists(itemElement)) {
   var processOnServer = this.RaiseItemClick(itemElement, htmlEvent);  
   var hasItemLink = this.GetLinkElement(itemElement) != null;
   if(processOnServer && !hasItemLink) {
    var name = this.GetItemElementName(itemElement);
    this.SendPostBack("CLICK:" + name);
   }
  }
 },
 RaiseItemClick: function(itemElement, htmlEvent){
  var processOnServer = this.autoPostBack || this.IsServerEventAssigned("ItemClick");
  if(!this.ItemClick.IsEmpty()){
   var name = this.GetItemElementName(itemElement);
   var args = new ASPxClientTitleIndexItemEventArgs(processOnServer, name, itemElement, htmlEvent);
   this.ItemClick.FireEvent(this, args);
   processOnServer = args.processOnServer;
  }
  return processOnServer;
 },
 DoFilter: function (filterMask){
  filterMask = _aspxTrim(filterMask);
  if(this.IsFilterMaskChanged(filterMask)){        
   this.SetPrevFilterMask(filterMask);   
   var filterRegEx = this.CreateFilterRegEx(filterMask);
   var isData = false;
   if (this.rowCount > 0) { 
    var categoryCount = 0;
    if (this.GetContentTDWidth() != 0)
     this.mainCellWidth = this.GetContentTDWidth();
    for(var i = 0; i < this.rowCount; i ++) {
     var categoryElem = this.GetCategoryHeaderElement(i);     
     var visibleColCount = 0;
     for(var j = 0; j < this.columnCount; j ++) {
       var visibleItemCount = this.FilterColumnInCategory(j, i, filterMask, filterRegEx);
       if (visibleItemCount != 0)
        visibleColCount ++;
      }
      if (visibleColCount != 0) {      
       this.ShowCategory(categoryElem);
       this.CorrectCategorySpacing(categoryElem, i);
       categoryCount ++;
      }
      else
       this.HideCategory(categoryElem);
    }
    isData = categoryCount != 0;
   }
   else { 
    var visibleColCount = 0;
    for (var i = 0; i < this.columnCount; i ++) {
     var visibleCategoryNodeCount = this.FilterColumn(i, -1, filterMask, filterRegEx);
     this.CorrectNodesPaddings(i, -1);
     if (visibleCategoryNodeCount != 0)
      visibleColCount ++;
    }
    isData = visibleColCount != 0;
   }
   if(isData)
    this.HideEmptyResultCaption();
   else
    this.ShowEmptyResultCaption();   
  }
 },
 DoFilterInternal: function() {
  this.DoFilter(this.GetFilterInputElement().value);
 },
 FilterColumn: function(columnIndex, rowIndex, filterMask, filterRegEx) {
  var columnElem = this.GetColumnElement(columnIndex, rowIndex);
  var groupElements = this.GetGroupElements(columnElem);  
  var visibleGroupCount = 0;
  for(var i = 0; i < groupElements.length; i ++) {
   visibleItemsCount = this.FilterItems(groupElements[i], filterRegEx);
   if(visibleItemsCount > 0) {
    visibleGroupCount ++;
    this.ShowGroup(groupElements[i]);
   }
   else
    this.HideGroup(groupElements[i]);
  }
  if(visibleGroupCount != 0) {
   _aspxSetElementVisibility(columnElem, true);
   this.SetColumnSeparatorDisplay(columnElem, true, columnIndex, rowIndex);   
  }
  else {
   _aspxSetElementVisibility(columnElem, false);
   this.SetColumnSeparatorDisplay(columnElem, false, columnIndex, rowIndex);
  }
  return visibleGroupCount;
 },
 FilterColumnInCategory: function(columnIndex, rowIndex, filterMask, filterRegEx) {
  var columnElem = this.GetColumnElement(columnIndex, rowIndex);
  var visibleItemCount = 0;
  if (_aspxIsExists(columnElem)) {
   var itemElements = this.GetItemElements(columnElem);
   for (var i = 0; i < itemElements.length; i++) {
    var itemText = this.GetItemText(itemElements[i]);
    if (!filterRegEx.test(itemText))
     _aspxSetElementDisplay(itemElements[i], false);
    else {
     _aspxSetElementDisplay(itemElements[i], true);
     visibleItemCount ++;
    }
   }
   if(visibleItemCount != 0) {
    this.SetColumnSeparatorDisplay(columnElem, true, columnIndex, rowIndex);
   }
   else {
    this.SetColumnSeparatorDisplay(columnElem, false, columnIndex, rowIndex);
   }
  }
  return visibleItemCount;
 },
 FilterItems: function(parentNodeElem, filterRegEx) {
  var itemElements = this.GetItemElements(parentNodeElem);  
  var visibleNodeCount = 0;
  for (var i = 0; i < itemElements.length; i++) {
   var itemText = this.GetItemText(itemElements[i]);
   if(filterRegEx.test(itemText)) {
    _aspxSetElementDisplay(itemElements[i], true);
    visibleNodeCount ++;
   }
   else
    _aspxSetElementDisplay(itemElements[i], false);
  }
  return visibleNodeCount;
 },
 ShowCategory: function(categoryElement) {
  var headerTR = categoryElement.parentNode; 
  _aspxSetElementDisplay(headerTR, true);
  if ((this.groupSpacing != 0) && !this.IsFirstCategoryTR(categoryElement)) 
   _aspxSetElementDisplay(headerTR.previousSibling, true);
  var categoryContentElem = null;
  if (this.groupContentPaddingTop == 0) {
   categoryContentElem = headerTR.nextSibling;
   _aspxSetElementDisplay(headerTR.nextSibling, true);
  }
  else {
   _aspxSetElementDisplay(headerTR.nextSibling, true);
   categoryContentElem = headerTR.nextSibling.nextSibling;
   _aspxSetElementDisplay(headerTR.nextSibling.nextSibling, true);
  }
  if (this.groupContentPaddingBottom != 0)
   _aspxSetElementDisplay(categoryContentElem.nextSibling, true);
  if (this.showBackToTop) {
   if (this.groupContentPaddingBottom != 0)
    _aspxSetElementDisplay(categoryContentElem.nextSibling.nextSibling, true);
   else
    _aspxSetElementDisplay(categoryContentElem.nextSibling, true);     
  }  
 },
 HideCategory: function(categoryElement) {
  var headerTR = categoryElement.parentNode; 
  _aspxSetElementDisplay(headerTR, false);
  if ((this.groupSpacing != 0) && !this.IsFirstCategoryTR(categoryElement)) 
   _aspxSetElementDisplay(headerTR.previousSibling, false);
  var categoryContentElem = null;
  if (this.groupContentPaddingTop == 0) { 
   categoryContentElem = headerTR.nextSibling;
   _aspxSetElementDisplay(headerTR.nextSibling, false);
  }
  else {
   _aspxSetElementDisplay(headerTR.nextSibling, false);
   categoryContentElem = headerTR.nextSibling.nextSibling;
   _aspxSetElementDisplay(headerTR.nextSibling.nextSibling, false);
  }  
  if (this.groupContentPaddingBottom != 0)
   _aspxSetElementDisplay(categoryContentElem.nextSibling, false);
  if (this.showBackToTop) {
   if (this.groupContentPaddingBottom != 0)
    _aspxSetElementDisplay(categoryContentElem.nextSibling.nextSibling, false);
   else
    _aspxSetElementDisplay(categoryContentElem.nextSibling, false);
  }   
 },
 ShowEmptyResultCaption: function() {
  var elem = this.GetEmptyResultCaptionElement();
  if (this.rowCount > 0 && (this.mainCellWidth > 0)) 
   elem.style.width = this.mainCellWidth + "px";
  _aspxSetElementDisplay(elem, true);
 },
 HideEmptyResultCaption: function() {
  var elem = this.GetEmptyResultCaptionElement();
  _aspxSetElementDisplay(elem, false);
 },
 ShowGroup: function(nodeElement) {
  if(!_aspxGetElementDisplay(nodeElement))
   _aspxSetElementDisplay(nodeElement, true);
 },
 HideGroup: function(nodeElement) {
  _aspxSetElementDisplay(nodeElement, false);  
 },
 SetColumnSeparatorDisplay: function(columnElem, value, columnIndex, rowIndex){
  if(columnIndex != this.columnCount - 1)
   this.SetRightColumnSeparatorDisplay(columnElem, value);  
  else{ 
   var prevColumn = this.GetColumnElement(columnIndex - 1, rowIndex);
   if((prevColumn != null) && (_aspxGetElementDisplay(prevColumn))){
    this.SetLeftColumnSeparatorDisplay(columnElem, value);
   }
  }
 },
 SetLeftColumnSeparatorDisplay: function(columnElem, value){
  var curElem = columnElem.previousSibling;
  while((curElem != null) && (curElem.id == "")){
   _aspxSetElementVisibility(curElem, value);
   curElem = curElem.previousSibling;
  }
 },
 SetRightColumnSeparatorDisplay: function(columnElem, value){
  var curElem = columnElem.nextSibling;
  while((curElem != null) && (curElem.id == "")){
   _aspxSetElementVisibility(curElem, value);
   curElem = curElem.nextSibling;
  }
 },
 OnFilterInputBlur: function(evt) {
  this.ClearPasteTimer();
 },
 OnFilterInputChange: function(evt) {
  if(this.GetFilterInputElement().value != ""){
   if(this.IsFilterTimerActive())
    this.ClearFilterTimer();
   this.DoFilter(this.GetFilterInputElement().value); 
  }
 },
 OnFilterInputFocus: function() {
  this.SetPasteTimer();
 },
 OnFilterInputKeyUp: function(evt) {
  if(this.IsAllowableKeyCode(evt.keyCode)){
   if(this.IsFilterTimerActive())
    this.ClearFilterTimer();
   this.SetFilterTimer(this.GetFilterInputElement(), this.filterDelay);
  }
 },     
 OnFilterInputKeyPress: function(evt) { 
  if (evt.keyCode == ASPxKey.Enter) 
   return false;
 }
});
ASPxClientTitleIndexItemEventArgs = _aspxCreateClass(ASPxClientProcessingModeEventArgs, {
 constructor: function(processOnServer, name, htmlElement, htmlEvent){
  this.constructor.prototype.constructor.call(this, processOnServer);
  this.name = name;
  this.htmlElement = htmlElement;
  this.htmlEvent = htmlEvent;
 }
});
function aspxSIFBlur(name) {
 var si = aspxGetControlCollection().Get(name);
 if(si != null) si.OnFilterInputBlur();
 return true;
}
function aspxSIFChange(evt, name) {
 var si = aspxGetControlCollection().Get(name);
 if(si != null) si.OnFilterInputChange(evt);
 return true;
}
function aspxSIFFocus(name) {
 var si = aspxGetControlCollection().Get(name);
 if(si != null) si.OnFilterInputFocus();
 return true;
}
function aspxSIFKeyUp(evt, name) {
 var si = aspxGetControlCollection().Get(name);
 if(si != null) si.OnFilterInputKeyUp(evt);
 return true;
}
function aspxSIFKeyPress(evt, name) {
 var si = aspxGetControlCollection().Get(name);
 if(si != null) return si.OnFilterInputKeyPress(evt);
 return true;
}
function aspxSFilterTimer(name){
 var si = aspxGetControlCollection().Get(name);
 if(si != null){
  si.DoFilter(si.GetFilterInputElement().value);
  si.ClearFilterTimer();
 }
}
function aspxSPasteTimer(name) {
 var si = aspxGetControlCollection().Get(name);
 if(si != null) si.DoFilterInternal();
}
function aspxIPItemClick(name, value) {
 var ti = aspxGetControlCollection().Get(name);
 if(ti != null) ti.DoIndexPanelItemClick(value);
}

