﻿Type.registerNamespace("Telerik.Web.UI");

// ---------- Telerik.Web.UI.Keys Enum ----------
Telerik.Web.UI.Keys = function (){}
Telerik.Web.UI.Keys.prototype = 
{
	Shift : 16,
	Escape: 27,
	Up : 38,
	Down : 40,
	Left : 37,
	Right : 39,
	Enter : 13,
	Tab : 9,
	Space : 32,
	PageUp : 33,
	Del : 46,
	F1: 112,
	F12 : 123
}
Telerik.Web.UI.Keys.registerEnum("Telerik.Web.UI.Keys");

Telerik.Web.UI.RadComboBoxFilter = function (){}
Telerik.Web.UI.RadComboBoxFilter .prototype = 
{
	None : 0,
	Contains : 1,
	StartsWith : 2
}

Telerik.Web.UI.RadComboBoxFilter.registerEnum("Telerik.Web.UI.RadComboBoxFilter");


// ---------- RadComboBox Class ----------
Telerik.Web.UI.RadComboBox = function (element)
{
	Telerik.Web.UI.RadComboBox.initializeBase(this, [element]);
	
	this._callbacktext = "";
	this._changeText = true;
	this._children = null;
	this._virtualScroll = true;
	this._itemData = null;
	this._selectedItem =  null;
	this._selectedIndex=  null;
	this._highlightedItem =  null;
	this._dropDownVisible = false;
	this._enableLoadOnDemand = false;
	this._enableTextSelection = true;
	this._setSelectedItem = false;
	this._enableItemCaching = false;
	this._openDropDownOnLoad = false;
	this._appendItems = false;
	this._allowCustomText = false;
	this._markFirstMatch =  false;
	this._filter =  0;
	this._originalText = this.get_inputDomElement().value;
	this._cachedText = this._originalText;
	this._cachedOffsetHeight = "";
	this._text = "";
	this._value = null;
	this._isCaseSensitive = false;
	this._autoCompleteSeparator = null;
	this._postBackReference = null;
	this._dropDownElement = null;
	this._inputDomElement = null;
	this._imageDomElement = null;
	this._tableElement = null;
	this._itemRequestTimeout = 300;
	this._isTemplated = false;
	this._requestTimeoutID = 0;
	this._highlightTemplatedItems = false;
	this._clientState = { value: "", text: "", enabled: true, logEntries: [] };
	this._uniqueId = null;
	this._rightToLeft = false;
	this._isDetached = false;
	this._offsetX = 0;
	this._offsetY = 0;
	this._overlay = null;
	this._enableScreenBoundaryDetection = true;
	this._suppressChange = false;
	this._lastKeyCode = null;
	this._loadingDiv = null;
	this._loadingMessage = "Loading...";
	this._showMoreResultsBox = false;
	this._closeDropDownOnBlur = true;
	this._focused = false;
	this._causesValidation = true;
	this.get_inputDomElement().setAttribute("autocomplete", "off");
	this._errorMessage = "CallBack Error!";
	this._showMoreMessage = "";
	this._webServiceSettings = new Telerik.Web.UI.WebServiceSettings({});
	this._webServiceLoader = null;
	this._clientDataString = null;
	this._enabled = true;
	this._fireEvents = this._enabled ;
	this._slide = null;
	this._expandAnimation = new Telerik.Web.UI.AnimationSettings({});
	this._expandDelay = 100;
	this._collapseAnimation = new Telerik.Web.UI.AnimationSettings({});
	this._collapseDelay = 500;
	this._slideDirection = Telerik.Web.UI.jSlideDirection.Down;
	this._animationEndedDelegate = null;
	this._animationStartedDelegate = null;
	this._showDropDownOnTextboxClick = true;
	this._dropDownWidth = "";
	this._height = "";
	this._maxHeight = "";
	this._childListElementWrapper = null;
	this._skin = "";
	this._skipLoadingItems = false;
	this._ajaxRequest = false;
	this._pendingAjaxRequestsCount = 0;
	this._endOfItems = false;
	this._emptyMessage = null;
	this._disposed = false;
	this._disposeChildElements = true;
	this._firstOpeningOfDropDown = true;
	
	this.lodHashTable =     
            {
            };

}

Telerik.Web.UI.RadComboBox._getScrollBarWidth = function()
{
    if (Telerik.Web.UI.RadComboBox._scrollbarWidth) return Telerik.Web.UI.RadComboBox._scrollbarWidth;

	var offsetWidth, clientWidth = 0;

	var outerDiv = document.createElement('div');
	outerDiv.style.position = 'absolute';
	outerDiv.style.top = '-1000px';
	outerDiv.style.left = '-1000px';
	outerDiv.style.width = '100px';
	outerDiv.style.height = '50px';
	outerDiv.style.overflow = 'hidden';

	var innerDiv = document.createElement('div');
	innerDiv.style.width = '100%';
	innerDiv.style.height = '200px';

	outerDiv.appendChild(innerDiv);
	document.body.appendChild(outerDiv);
	
	var widthNoScroll =	innerDiv.offsetWidth;
							
	outerDiv.style.overflow = 'auto';
	
	var widthScroll = innerDiv.offsetWidth;
	
	Telerik.Web.UI.RadComboBox._scrollbarWidth = widthNoScroll - widthScroll;					
	
	if(Telerik.Web.UI.RadComboBox._scrollbarWidth <= 0)
	{
		innerDiv.style.width = '300px';									
	
		offsetWidth = outerDiv.offsetWidth;

		clientWidth = outerDiv.clientWidth;
		
		Telerik.Web.UI.RadComboBox._scrollbarWidth = offsetWidth - clientWidth;
	}								
				    
	if(Telerik.Web.UI.RadComboBox._scrollbarWidth <= 0)
		Telerik.Web.UI.RadComboBox._scrollbarWidth = 16;

	document.body.removeChild(document.body.lastChild);
				
	return Telerik.Web.UI.RadComboBox._scrollbarWidth;
}

//IE8: document.documentMode is supported only in this version.
//Returns the compatibility mode of the document: 5 (Quirks Mode), 7 (IE7 Standards Mode), 8 (IE8 Standards Mode).
Telerik.Web.UI.RadComboBox._isIE8StandardsMode = ((document.documentMode) && (document.documentMode == 8));

//This is the patched version of $telerik.getLocation.
//Contains various corrections to the value returned by $telerik.getLocation.
//These apply only to RadComboBox and that is the reason for this new function.
Telerik.Web.UI.RadComboBox._getLocation = function(element) {
    var position = $telerik.getLocation(element);
    
    if (Telerik.Web.UI.RadComboBox._isIE8StandardsMode) {        
        //Sys.UI.DomElement.getLocation returns incorrect position of the element - 
        //2 is substracted from the both real left and top values.
        position.x += 2;
        position.y += 2;
    }
    
    return position;
}

Telerik.Web.UI.RadComboBox.htmlEncode = function(text)
{
    var escapedSymbols = {'&':'&amp;', '<':'&lt;', '>':'&gt;'};

    for(var symbol in escapedSymbols)
    text = text.replace(new RegExp(symbol, 'g'), escapedSymbols[symbol]);

    return text;
}

Telerik.Web.UI.RadComboBox.ComboBoxes = [];

Telerik.Web.UI.RadComboBox._createChildControls = function (parent, items)
{
	
	var itemData = parent.get_itemData();

	if (!itemData) return;
	
	var  childListElement = parent.get_childListElement();
	
	if (!childListElement) return;
	
	var childElements = $telerik.getChildrenByTagName(parent.get_childListElement(), "li");
	var itemsLength = childElements.length;
	var startIndex = 0;
	
	//Handle the case when a loading message appears
	if( childElements.length > 0 && childElements[0].className == "rcbLoading" )
	{
		itemsLength = itemsLength - 1;
		startIndex = 1;
	}
	
	for (var i = startIndex, length = childElements.length; i < length; i++)
	{
		var item = new Telerik.Web.UI.RadComboBoxItem();
		items.add(item);
		item._initialize(itemData[i-startIndex], childElements[i]);
	}	
}

Telerik.Web.UI.RadComboBox.prototype =
{
    initialize: function()
    {
        Telerik.Web.UI.ControlItemContainer.callBaseMethod(this, 'initialize');

        this._log.initialize();
        this._initializeEventMap();
        this._initializeAnimation();

        this._clientState.value = this._value;
        this._clientState.text = this._text;
        this.updateClientState();

        if (this._requiresRightToLeft())
        {
            this._initRightToLeft();
        }

        if (this.get_childListElement())
        {
            this._onDropDownClickDelegate = Function.createDelegate(this, this._onDropDownClick);
            $addHandler(this.get_childListElement(), "click", this._onDropDownClickDelegate);

            this._onDropDownHoverDelegate = Function.createDelegate(this, this._onDropDownHover);
            $addHandler(this.get_childListElement(), "mouseover", this._onDropDownHoverDelegate);

            this._cancelDelegate = Function.createDelegate(this, this._cancelEvent);
            $addHandler(this.get_childListElement(), "selectstart", this._cancelDelegate);
            $addHandler(this.get_childListElement(), "dragstart", this._cancelDelegate);

            this._onDropDownOutDelegate = Function.createDelegate(this, this._onDropDownOut);
            $addHandler(this.get_childListElement(), "mouseout", this._onDropDownOutDelegate);
        }

        this._onTableHoverDelegate = Function.createDelegate(this, this._onTableHover);
        $telerik.addExternalHandler(this.get_tableElement(), "mouseover", this._onTableHoverDelegate);

        this._onTableOutDelegate = Function.createDelegate(this, this._onTableOut);
        $telerik.addExternalHandler(this.get_tableElement(), "mouseout", this._onTableOutDelegate);


        this._onPropertyChangeDelegate = Function.createDelegate(this, this._onInputPropertyChange);
        $addHandler(this.get_inputDomElement(), "propertychange", this._onPropertyChangeDelegate);

        this._onFocusDelegate = Function.createDelegate(this, this._onFocus);
        $addHandler(this.get_inputDomElement(), "focus", this._onFocusDelegate);

        this._onDocumentClickDelegate = Function.createDelegate(this, this._onDocumentClick);

        // There is a bug in ASP.NET AJAX in IE6, the workaround is to attach the handler directly
        if ($telerik.isIE)
        {
            document.attachEvent("onmousedown", this._onDocumentClickDelegate);
            document.attachEvent("oncontextmenu", this._onDocumentClickDelegate);
        }
        else
        {
            $addHandler(document, "mousedown", this._onDocumentClickDelegate);
            $addHandler(document, "contextmenu", this._onDocumentClickDelegate);
        }

        this._onDropDownScrollDelegate = Function.createDelegate(this, this._onDropDownScroll);
        $addHandler(this.get_childListElementWrapper(), "scroll", this._onDropDownScrollDelegate);

        this._eventMap.addHandlerForClassName("click", "rcbInput", this._onInputClick);
        this._eventMap.addHandlerForClassName("keydown", "rcbInput", this._onKeyDown);
        this._eventMap.addHandlerForClassName("keypress", "rcbInput", this._onKeyPress);

        if (!$telerik.isIE)
            this._eventMap.addHandlerForClassName("input", "rcbInput", this._onInputChange);

        if (this.get_imageDomElement())
        {
            this._onImageClickDelegate = Function.createDelegate(this, this._onImageClick);
            $addHandler(this.get_imageDomElement(), "click", this._onImageClickDelegate);
        }

        this._onWindowResizeDelegate = Function.createDelegate(this, this._onWindowResize);
        $addHandler(window, "resize", this._onWindowResizeDelegate);

        this._onWindowUnloadDelegate = Function.createDelegate(this, this._onWindowUnload);
        $addHandler(window, "unload", this._onWindowUnloadDelegate);

        if (this._openDropDownOnLoad)
        {
            this._onOpenOnLoad = Function.createDelegate(this, this.showDropDown);
            $addHandler(window, "load", this._onOpenOnLoad);
        }

        if (this.get_moreResultsBoxElement())
        {
            this._onMoreResultsBoxClickDelegate = Function.createDelegate(this, this._onMoreResultsBoxClick);
            $addHandler(this.get_moreResultsBoxElement(), "click", this._onMoreResultsBoxClickDelegate);

            this._onMoreResultsBoxOverDelegate = Function.createDelegate(this, this._onMoreResultsBoxOver);
            $addHandler(this.get_moreResultsBoxElement(), "mouseover", this._onMoreResultsBoxOverDelegate);

            this._onMoreResultsBoxOutDelegate = Function.createDelegate(this, this._onMoreResultsBoxOut);
            $addHandler(this.get_moreResultsBoxElement(), "mouseout", this._onMoreResultsBoxOutDelegate);
        }


        if (this._openDropDownOnLoad && !this.get_dropDownVisible())
        {
            this.showDropDown();
        }

        var me = this;

        Array.add(Telerik.Web.UI.RadComboBox.ComboBoxes, this);

        if (this._fireEvents)
        {
            this.raiseEvent("load", null);
        }

        // Set an expando property "value" in order to be validated correctly.
        this.get_element().value = this._text;

    },

    _applyZIndex: function()
    {
        //set zIndex
        var zIndex = this.get_element().style.zIndex;
        var zDropDownIndex = this.get_dropDownElement().parentNode.style.zIndex;
        if (zIndex == 0)
        {
            zIndex = zDropDownIndex;
        }

        this.get_dropDownElement().parentNode.style.zIndex = zIndex;
    },

    _initializeAnimation: function()
    {
        var animatedElement = this._getAnimatedElement();

        if (animatedElement)
        {
            this._slide = new Telerik.Web.UI.jSlide(animatedElement, this.get_expandAnimation(), this.get_collapseAnimation());
            this._slide.initialize();
            this._slide.set_direction(this.get_slideDirection());
        }

        this._animationEndedDelegate = Function.createDelegate(this, this._onAnimationEnded);
        this._slide.add_expandAnimationEnded(this._animationEndedDelegate);
        this._slide.add_collapseAnimationEnded(this._animationEndedDelegate);

        this._animationStartedDelegate = Function.createDelegate(this, this._onAnimationStarted);
        this._slide.add_expandAnimationStarted(this._animationStartedDelegate);
        this._slide.add_collapseAnimationStarted(this._animationStartedDelegate);
    },

    _onAnimationEnded: function(sender, e)
    {
        if (window.netscape && !window.opera)
        {
            this.get_childListElementWrapper().style.overflow = "auto";

            if (this.get_dropDownVisible())
            {
                if (this.get_selectedItem())
                {
                    this.get_selectedItem().scrollOnTop();
                }
            }
        }
    },

    _onAnimationStarted: function(sender, e)
    {
        if (window.netscape && !window.opera)
        {
            this.get_childListElementWrapper().style.overflow = "hidden";
        }
    },

    _requiresRightToLeft: function()
    {
        var currentElement = this.get_element();
        while (currentElement.nodeType !== 9)
        {
            if (currentElement.dir == "rtl")
                return true;

            currentElement = currentElement.parentNode;
        }
        return false;
    },

    _initRightToLeft: function()
    {

        this._rightToLeft = true;
        if (this._skin)
        {

            this.get_element().className = String.format("{0} RadComboBox_{1}_rtl",
				this.get_element().className, this._skin);

            this.get_dropDownElement().className = String.format("{0} RadComboBoxDropDown_{1}_rtl", this.get_dropDownElement().className, this._skin);
        }
        if (this.get_imageDomElement())
        {
            if (Sys.UI.DomElement.containsCssClass(this.get_imageDomElement().parentNode, "rcbArrowCellRight"))
            {
                this._replaceCssClass(this.get_imageDomElement().parentNode, "rcbArrowCellRight", "rcbArrowCellLeft");
                this.get_inputDomElement().parentNode.className = "rcbInputCell rcbInputCellRight";
            }
            else
            {
                this._replaceCssClass(this.get_imageDomElement().parentNode, "rcbArrowCellLeft", "rcbArrowCellRight");
                this.get_inputDomElement().parentNode.className = "rcbInputCell rcbInputCellLeft";
            }
        }

    },

    _replaceCssClass: function(element, oldClass, newClass)
    {
        element.className = element.className.replace(oldClass, newClass);
    },

    dispose: function()
    {
        Array.remove(Telerik.Web.UI.RadComboBox.ComboBoxes, this);

        if (this._animationEndedDelegate)
        {
            if (this._slide)
            {
                this._slide.remove_expandAnimationEnded(this._animationEndedDelegate);
                this._slide.remove_collapseAnimationEnded(this._animationEndedDelegate);
            }

            this._animationEndedDelegate = null;
        }

        if (this._animationStartedDelegate)
        {
            if (this._slide)
            {
                this._slide.remove_expandAnimationStarted(this._animationStartedDelegate);
                this._slide.remove_collapseAnimationStarted(this._animationStartedDelegate);
            }

            this._animationStartedDelegate = null;
        }

        $removeHandler(window, "unload", this._onWindowUnloadDelegate);
        $removeHandler(window, "resize", this._onWindowResizeDelegate);
        $removeHandler(this.get_inputDomElement(), "propertychange", this._onPropertyChangeDelegate);
        $removeHandler(this.get_inputDomElement(), "focus", this._onFocusDelegate);

        if ($telerik.isIE)
        {
            document.detachEvent("onmousedown", this._onDocumentClickDelegate);
            document.detachEvent("oncontextmenu", this._onDocumentClickDelegate);
        }
        else
        {
            $removeHandler(document, "mousedown", this._onDocumentClickDelegate);
            $removeHandler(document, "contextmenu", this._onDocumentClickDelegate);
        }
        if (this.get_childListElement())
        {
            $removeHandler(this.get_childListElement(), "click", this._onDropDownClickDelegate);
            $removeHandler(this.get_childListElement(), "mouseover", this._onDropDownHoverDelegate);
            $removeHandler(this.get_childListElement(), "mouseout", this._onDropDownOutDelegate);
            $removeHandler(this.get_childListElement(), "selectstart", this._cancelDelegate);
            $removeHandler(this.get_childListElement(), "dragstart", this._cancelDelegate);
        }

        if (this.get_tableElement())
        {
            $telerik.removeExternalHandler(this.get_tableElement(), "mouseover", this._onTableHoverDelegate);
            $telerik.removeExternalHandler(this.get_tableElement(), "mouseout", this._onTableOutDelegate);
        }

        if (this.get_imageDomElement())
        {
            $removeHandler(this.get_imageDomElement(), "click", this._onImageClickDelegate);
        }

        if (this._openDropDownOnLoad)
        {
            $removeHandler(window, "load", this._onOpenOnLoad);
        }

        if (this.get_moreResultsBoxElement())
        {
            $removeHandler(this.get_moreResultsBoxElement(), "click", this._onMoreResultsBoxClickDelegate);
            $removeHandler(this.get_moreResultsBoxElement(), "mouseover", this._onMoreResultsBoxOverDelegate);
            $removeHandler(this.get_moreResultsBoxElement(), "mouseout", this._onMoreResultsBoxOutDelegate);
        }
        $removeHandler(this.get_childListElementWrapper(), "scroll", this._onDropDownScrollDelegate);

        if (this._slide)
        {
            this._slide.dispose();
            this._slide = null;
        }
        this._removeDropDown();
        this._disposed = true;

        Telerik.Web.UI.RadComboBox.callBaseMethod(this, 'dispose');

        this._tableElement._events = null;
        this._inputDomElement._events = null;
        this._imageDomElement._events = null;
        this._childListElementWrapper._events = null;
    },

    _cancelEvent: function(e)
    {
        e.preventDefault();
        return false;
    },

    _onDropDownScroll: function(e)
    {
        if (!this._virtualScroll || this._ajaxRequest || this._endOfItems)
        {
            return;
        }
        var itemsCount = this.get_items().get_count();
        var itemHeight = 22;
        var itemScroll = 0;

        if (itemsCount > 0)
        {
            itemHeight = this.get_items().getItem(0).get_element().offsetHeight;
            itemScroll = this.get_items().getItem(itemsCount - 1).get_element().offsetTop;
        }
        var emptyElement = $telerik.getFirstChildByTagName(this.get_childListElement(), "div", 0);
        if (emptyElement)
        {
            var height = emptyElement.offsetHeight;
            if (this.get_childListElementWrapper().scrollTop + height >= this.get_childListElement().offsetHeight - height)
            {
                this.requestItems(this.get_text(), true);
            }
        }

    },

    _detachDropDown: function()
    {

        if ((!document.readyState || document.readyState == "complete") && (!this._isDetached))
        {
            var parentElement = this._findParentForm() || document.body;

            var dropDown = this.get_dropDownElement();
            var slide = this.get_dropDownElement().parentNode;
            slide.parentNode.removeChild(slide);
            slide.style.marginLeft = "0";

            parentElement.insertBefore(slide, parentElement.firstChild);

            this._isDetached = true;
        }
    },

    _removeDropDown: function()
    {
        var slide = this.get_dropDownElement().parentNode;
        slide.parentNode.removeChild(slide);
        if (this._disposeChildElements)
        {
            Sys.WebForms.PageRequestManager.getInstance()._destroyTree(slide);
        }

        if (!$telerik.isSafari)
            slide.outerHTML = null;
        this._dropDownElement = null;
    },

    //dropdown needs to be attached during ajax request in some cases(when the postbacks fires from templated item)
    attachDropDown: function()
    {
        var slide = this.get_dropDownElement().parentNode;
        slide.parentNode.removeChild(slide);
        this.get_tableElement().parentNode.appendChild(slide);
    },
    _findParentForm: function()
    {
        var currentElement = this.get_element();
        while (currentElement && currentElement.tagName && currentElement.tagName.toLowerCase() != "form")
        {
            currentElement = currentElement.parentNode;
        }

        if (!currentElement.tagName)
            currentElement = null;

        return currentElement;
    },

    _findNearestItem: function(element)
    {
        while (element.nodeType !== 9)
        {
            if (element._item && Telerik.Web.UI.RadComboBoxItem.isInstanceOfType(element._item))
            {
                return element._item;
            }
            element = element.parentNode;
        }

        return null;
    },


    _positionDropDown: function()
    {
        if (this._skipDropDownPositioning) { return ; }
        
        this._detachDropDown();

        var startElement = this.get_element();
        var slide = this._getAnimationContainer();

        slide.style.position = "absolute";

        var position = Telerik.Web.UI.RadComboBox._getLocation(startElement);

        var dropDown = this.get_dropDownElement();
        var dropDownWidth = this.get_element().offsetWidth;

        if (this._dropDownWidth)
        {
            dropDownWidth = this._dropDownWidth;
        }

        var childListElement = this.get_childListElement();

        var childListElementWrapper = this.get_childListElementWrapper();

        var slideTop = position.y + this.get_offsetY() + this.get_element().offsetHeight;

        slide.style.top = slideTop + "px";
        slide.style.left = position.x + this.get_offsetX() + "px";

        if (this._rightToLeft && document.body.dir == "rtl")
        {
            slide.style.left = "";
            slide.style.left = position.x + this.get_offsetX() - Telerik.Web.UI.RadComboBox._getScrollBarWidth() + "px";
        }

        dropDown.style.display = "block";

        dropDown.style.width = dropDownWidth + "px";

        var difference = 0;

        if (!this._dropDownWidth)
        {
            difference = dropDown.offsetWidth - dropDownWidth;
        }


        if (difference > 0 && difference < dropDownWidth)
        {
            dropDown.style.width = dropDownWidth - difference + "px";
        }

        if (this._rightToLeft)
        {
            dropDown.dir = "rtl";
        }

        this._determineScreenBoundaryDetection();

    },

    _calculateItemsHeight: function()
    {
        var itemHeight = 0;

        var numberOfItems = this.get_items().get_count();
        for (var i = 0; i < numberOfItems; i++)
            itemHeight += this.get_items().getItem(i).get_element().offsetHeight;

        return itemHeight;
    },

    _calculateDropDownAutoHeight: function()
    {
        var dropDown = this.get_dropDownElement();
        var animationContainer = this._getAnimationContainer();
        var position = Telerik.Web.UI.RadComboBox._getLocation(this.get_element());
        var animationContainer = this._getAnimationContainer();
        var animationContainerPosition = Telerik.Web.UI.RadComboBox._getLocation(animationContainer);
        var screenSize = $telerik.getViewPortSize();
        var y = position.y - dropDown.offsetHeight;
        var downSpace = screenSize.height - animationContainerPosition.y;
        var upSpace = animationContainerPosition.y - this.get_element().offsetHeight;
        var height = downSpace;
        var additionalElements = false;
        var chHeight = 0;

        if (this._getHeaderElement())
        {
            chHeight = chHeight + this._getHeaderElement().offsetHeight;
            additionalElements = true;
        }
        
        if (this._getFooterElement())
        {
            chHeight = chHeight + this._getFooterElement().offsetHeight;
            additionalElements = true;
        }

        if (this.get_moreResultsBoxElement())
        {
            chHeight = chHeight + this.get_moreResultsBoxElement().offsetHeight;
            additionalElements = true;
        }
        
        if (this._enableScreenBoundaryDetection && downSpace < upSpace)
        {
            height = upSpace;
        }
        
        var childListElementOffsetHeight = this.get_childListElement().offsetHeight;
        
        //If the child list element height is greater than the Max Height, limit the former to the latter.
        //This happens if 'Virtual Scrolling'/'Show More Results is used' - then an empty DIV element with
        //specific height is rendered INSIDE the UL. Thed difference between actual sum Items height and the UL offset height
        //causes the drop down to stretch to large sizes.
        if (this._height == "" && this._maxHeight != "" && childListElementOffsetHeight > this._maxHeight) {
            childListElementOffsetHeight = this._maxHeight;
        }
        
        if (!(height >= 0 && (childListElementOffsetHeight + chHeight) >= height))
        {
            height = childListElementOffsetHeight + chHeight;
        }
        
        if (additionalElements && chHeight < height)
        {
            this.get_childListElementWrapper().style.height = height - chHeight + "px";
        }
        else
        {
            this.get_childListElementWrapper().style.height = height + "px";
        }
        
        return height;
    },

    _determineScreenBoundaryDetection: function()
    {
        var dropDown = this.get_dropDownElement();
        var animationContainer = this._getAnimationContainer();
        var position = Telerik.Web.UI.RadComboBox._getLocation(this.get_element());
        var animationContainer = this._getAnimationContainer();
        var animationContainerPosition = Telerik.Web.UI.RadComboBox._getLocation(animationContainer);


        var screenSize = $telerik.getViewPortSize();
        var height = dropDown.offsetHeight;
        if (this._height == "" && this.get_childListElement())
        {
            if (this._maxHeight == "" || this._calculateItemsHeight() < this._maxHeight)
            {
                this._cachedOffsetHeight = height;
                height = this._calculateDropDownAutoHeight();
            }
            else if (this._maxHeight != "")
            {
                if (this._cachedOffsetHeight != "")
                    height = this._cachedOffsetHeight;
                this.get_dropDownElement().style.height = "";
                this.get_childListElementWrapper().style.height = this._maxHeight + "px";
            }
        }

        if (this._enableScreenBoundaryDetection)
        {
            if (this._elementOverflowsBottom(screenSize, dropDown, this.get_inputDomElement()))
            {
                var y = position.y - height;

                if (y >= 0)
                {
                    this.set_slideDirection(Telerik.Web.UI.jSlideDirection.Up);
                    this._getAnimationContainer().style.height = this.get_dropDownElement().offsetHeight;
                    this._getAnimationContainer().style.top = position.y - this.get_offsetY() - dropDown.offsetHeight + "px";
                    if (window.netscape && !window.opera)
                    {
                        this._getAnimationContainer().style.top = position.y - this.get_offsetY() - dropDown.offsetHeight + 2 + "px";
                    }
                    if (this._height == "" && (this._maxHeight == "" || this._calculateItemsHeight() < this._maxHeight) && height == animationContainerPosition.y - this.get_element().offsetHeight)
                    {
                        this._getAnimationContainer().style.top = "0px";
                    }
                }
                else
                {
                    this.set_slideDirection(Telerik.Web.UI.jSlideDirection.Down);

                }
            }
            else
            {
                this.set_slideDirection(Telerik.Web.UI.jSlideDirection.Down);

            }

        }

        this.set_dropDownVisible(true);

    },

    _elementOverflowsBottom: function(screenSize, element, startingElement)
    {
        var bottomEdge = Telerik.Web.UI.RadComboBox._getLocation(startingElement).y + element.offsetHeight;
        return bottomEdge > screenSize.height;
    },

    _selectFirstMatch: function()
    {
        var itemToSelect = this._findItemToSelect();

        if (itemToSelect && itemToSelect.get_enabled() && !itemToSelect.get_isSeparator())
        {
            itemToSelect.highlight();
            itemToSelect.scrollOnTop();
        }
    },

    _findItemToSelect: function()
    {
        //Required to support multiple items with the same text.
        var itemToSelect = this.findItemByValue(this.get_value());

        if (!itemToSelect)
            itemToSelect = this.findItemByText(this.get_text());

        return itemToSelect;
    },


    clearItems: function()
    {
        this.get_items().clear();
        this._itemData = null;

    },

    clearSelection: function()
    {
        this.set_text("");
        this.set_value("");
        this.set_selectedItem(null);
        this.set_highlightedItem(null);
    },

    decodeText: function(value)
    {
        var result = value;
        var escapedSymbols = { '&lt;': '<', '&gt;': '>', '&amp;': '&', '&quot;': '"' };

        for (var symbol in escapedSymbols)
            result = result.replace(new RegExp(symbol, 'g'), escapedSymbols[symbol]);

        return result;
    },

    _findNextAvailableIndex: function(index, letter)
    {
        var items = this.get_visibleItems();

        for (var i = index, length = items.length; i < length; i++)
        {
            if (items[i].get_enabled() && !items[i].get_isSeparator())
            {
                if (letter == null)
                {
                    return i;
                }
                if (letter && items[i].get_text().indexOf(letter) == 0)
                {
                    return i;
                }
            }
        }

        return items.length;
    },

    _findPrevAvailableIndex: function(index)
    {
        var items = this.get_visibleItems();

        if (items.length < 1) return -1;

        for (var i = index; i >= 0; i--)
        {
            if (items[i].get_enabled() && !items[i].get_isSeparator())
            {
                return i;
            }
        }

        return -1;
    },
    _onDropDownClick: function(e)
    {
        if (this._eventMap.skipElement(e, null))
            return;

        if (!this._enabled) return;

        var item = this._findNearestItem(e.target);
        if (!item || !item.get_enabled() || item.get_isSeparator()) return;
        
        try
        {
            //If the input element has visibility: hidden; or display: block; IE throws an exception, so catch it and continue.
            this.get_inputDomElement().focus();
        }
        catch(e) {}
        
        this._performSelect(item, e);
        this._hideDropDown(e);
        
        if (!this.get_isTemplated() && this.get_filter() != Telerik.Web.UI.RadComboBoxFilter.None && e.stopPropagation)
            e.stopPropagation();
    },

    _onDropDownHover: function(e)
    {
        if (!this._enabled || this._ajaxRequest) return;

        var item = this._findNearestItem(e.target);

        if (!item || !item.get_enabled() || item.get_isSeparator()) return;
        item.highlight();
    },

    _onDropDownOut: function(e)
    {
        if (!this._enabled) return;

        if (!e) e = event;
        var relatedTarget = this._getRelatedTarget(e);
        if (!relatedTarget) return;
	
		while (relatedTarget && relatedTarget.nodeType !== 9)
		{
			if (relatedTarget.parentNode == this.get_dropDownElement())
			{
				return;
			}
			
			relatedTarget = relatedTarget.parentNode;
		}

        var highlightedItem = this.get_highlightedItem();
        if (highlightedItem)
        {
            highlightedItem.unHighlight();
        }
    },

    _onTableHover: function(e)
    {
        if (!this._enabled) return;

        var table = this.get_tableElement();
        if (table != null && table.className != "rcbFocused")
        {
            table.className = "rcbHovered";

        }
    },


    _onTableOut: function(e)
    {
        if (!this._enabled) return;

        if (!e) e = event;
        var table = this.get_tableElement();
        var target = e.target || e.srcElement;
        var relatedTarget = this._getRelatedTarget(e);
        if (!relatedTarget) return;

		while (relatedTarget && relatedTarget.nodeType !== 9)
		{
			if (relatedTarget.parentNode && relatedTarget.parentNode == table)
			{
				return;
			}
			
			relatedTarget = relatedTarget.parentNode;
		}

        if (table != null && table.className == "rcbHovered")
        {
            table.className = "";
        }
    },
    
    _getRelatedTarget: function(e)
    {
        var relatedTarget = e.toElement || e.relatedTarget || e.fromElement;
        
        // Firefox sometimes fires an event without related target.
        if (!relatedTarget) return null;

		try
		{
			var dummy = relatedTarget.tagName;
		}
		catch(ex)
		{
			// Firefox sometimes returns XUL elements as relatedTarget.
			// Trying to access their properties throws an exception.
			relatedTarget = null;
		}
		
		return relatedTarget;
    },

    _onDocumentClick: function(e)
    {
        if (!e) e = event;

        var target = e.target || e.srcElement;

        while (target.nodeType !== 9)
        {
            if (target.parentNode == null || target == this.get_element() || target == this.get_dropDownElement())
            {
                return;
            }
            target = target.parentNode;
        }
        
        if (this._focused)
        {
            this._raiseClientBlur(e);
            this._selectItemOnBlur(e);
            this._focused = false;
        }
        
        if (this.get_dropDownVisible() && this.get_closeDropDownOnBlur())
        {
            this._hideDropDown(e);
        }
    },

    _selectItemOnBlur: function(e)
    {
        var itemToSelect = this._findItemToSelect();
        if (!itemToSelect && !this.get_allowCustomText() && this.get_items().get_count() > 0)
        {
            if (this.get_markFirstMatch())
            {
                if (this.get_text() == "")
                {
                    this.set_text(this._originalText);
                }
                this.highlightMatches();

                this.selectText(0, 0);

                itemToSelect = this.get_highlightedItem();
            }

        }
        if (!this.get_allowCustomText() && !this.get_enableLoadOnDemand() && this.get_filter() != Telerik.Web.UI.RadComboBoxFilter.None)
        {

            itemToSelect = this.get_highlightedItem();
            if (this.get_highlightedItem() == null && this.get_selectedItem())
            {
                itemToSelect = this.get_selectedItem();
            }
            else if (!this.get_highlightedItem() && this.get_visibleItems().length > 0)
            {
                itemToSelect = this.get_visibleItems()[0];
            }
        }

        if (this.get_filter() != Telerik.Web.UI.RadComboBoxFilter.None)
        {
            this.setAllItemsVisible(true);
        }

        this._performSelect(itemToSelect, e);
    },

    _onWindowResize: function()
    {
        if (this.get_dropDownVisible())
        {
            this._positionDropDown();

        }
    },

    _onWindowUnload: function()
    {
        this._disposeChildElements = false;
    },
    _onKeyDown: function(e)
    {
        if (!this._fireEvents || this._ajaxRequest) return;

        if (!e) e = event;

        this.raise_onClientKeyPressing(e);

        var keyCode = e.keyCode || e.which;

        this._lastKeyCode = keyCode;

        var letter = String.fromCharCode(keyCode);

        if (keyCode == Telerik.Web.UI.Keys.Escape && this.get_dropDownVisible())
        {
            if (this.get_dropDownVisible())
            {
                this._hideDropDown(e);
            }
            return;
        }
        else if (keyCode === Telerik.Web.UI.Keys.Enter)
        {
            if (this.get_dropDownVisible())
            {
                this._hideDropDown(e);
            }
            this._performSelect(this.get_highlightedItem(), e);
            
            if (this.get_markFirstMatch()) {
                var textLength = this.get_text().length;
                this.selectText(textLength, textLength);
            }
            
            e.returnValue = false;
            if (e.preventDefault)
            {
                e.preventDefault();
            }
            return;
        }
        else if (keyCode === Telerik.Web.UI.Keys.Down)
        {
            e.returnValue = false;
            if (e.altKey)
            {
                this._toggleDropDown(e);
                return;
            }
            this.highlightNextItem(null);
            if (e.preventDefault)
            {
                e.preventDefault();
            }
            return;
        }
        else if (keyCode === Telerik.Web.UI.Keys.Up)
        {
            e.returnValue = false;
            if (e.altKey)
            {
                this._toggleDropDown(e);
                return;
            }
            this.highlightPreviousItem();
            if (e.preventDefault)
            {
                e.preventDefault();
            }
            return;
        }
        else if (keyCode === Telerik.Web.UI.Keys.Tab)
        {
            if (this.get_dropDownVisible())
            {
                this._hideDropDown(e);
            }
            this._raiseClientBlur(e);
            this._selectItemOnBlur(e);
            this._focused = false;

            return;
        }

        if (keyCode == Telerik.Web.UI.Keys.Left || keyCode == Telerik.Web.UI.Keys.Right)
        {
            return;
        }
        
        if (letter && ( ! e.altKey) && !(this.get_enableLoadOnDemand() || !this.get_readOnly()))
        {
            this.highlightNextItem(letter);
            return;
        }
    },
    
    _onKeyPress: function(e) {
        if (!this._fireEvents || this._ajaxRequest) return;
        
        var charCode = e.charCode || e.keyCode;
        
        //MarkFirstMatch == "true" and AutoCompleteSeparator != "" and AutoCompleteSeparator == [Pressed Character]
        if ((this.get_markFirstMatch()) &&
            (this.get_autoCompleteSeparator()) &&
            (this.get_autoCompleteSeparator().charCodeAt(0) == charCode)) {
            this._performSelect(this.get_highlightedItem(), e);
            
            if (this.get_highlightedItem()) {
                this.get_highlightedItem().unHighlight();
            }
            
            //Clear the Text selection and position the cursor at the end of the input text.
            var textLength = this.get_text().length;
            this.selectText(textLength, textLength);
        }
    },

    _onImageClick: function(e)
    {
        if (this._enabled)
        {
            if (!this.get_dropDownVisible())
            {
                this._selectFirstMatch();
            }
            this._toggleDropDown(e);
        }
    },

    _onInputClick: function(e)
    {
        if (this._enabled)
        {
            this._selectFirstMatch();

            this.selectText(0, this.get_text().length);

            if (!this.get_dropDownVisible() && this._showDropDownOnTextboxClick)
            {
                this._showDropDown(e);
            }

            return true;
        }
    },

    _onMoreResultsBoxClick: function(e)
    {
        this.requestItems(this.get_text(), true);
    },

    _onMoreResultsBoxOver: function(e)
    {
        this.get_moreResultsBoxElement().style.cursor = "pointer";
    },

    _onMoreResultsBoxOut: function(e)
    {
        this.get_moreResultsBoxElement().style.cursor = "default";
    },
    _onFocus: function(e)
    {
        if (this._focused)
            return;

        if (this.get_emptyMessage() && this.get_emptyMessage() == this.get_text())
        {
            this._suppressChange = true;
            this.get_inputDomElement().value = this._text;

            //Works around an ASP.NET AJAX bug which manifests only in IE7: 
            //if a second property is changed via code,
            //the propertychange event will not fire on the next user interaction with the <input>.
            (function(combo)
            {
                setTimeout(function() { combo.get_inputDomElement().className = "rcbInput"; }, 0);
            })(this);

            this._suppressChange = false;
        }

        var table = this.get_tableElement();
        if (table != null)
        {
            //Works around the same bug as above:
            //the same thing happens with a property of the parent <table> element as well.
            (function()
            {
                setTimeout(function() { table.className = "rcbFocused"; }, 0);
            })();
        }

        if (!e && typeof (event) != "undefined") e = event;

        this._focused = true;

        this.raise_onClientFocus(e);
        return true;
    },

    _raiseClientBlur: function(e)
    {
        if (this._focused)
        {
            var table = this.get_tableElement();
            if (table != null)
            {
                table.className = "";
            }
            this._applyEmptyMessage();
            this.raise_onClientBlur(e);
        }
    },

    _applyEmptyMessage: function()
    {
        if (this.get_emptyMessage() && this.get_text() == "")
        {
            this._suppressChange = true;
            this.get_inputDomElement().className += " rcbEmptyMessage";
            this.get_inputDomElement().value = this.get_emptyMessage();
            this._suppressChange = false;
        }
    },


    _onInputChange: function()
    {
        //Reset the value (required to support multiple items with the same text)
        this.set_value("");

        var text = this.get_text();
        if (this.get_emptyMessage() != "" && text != this.get_emptyMessage())
        {
            this._text = text;
        }

        // Set an expando property "value" in order to be validated correctly.
        this.get_element().value = this._text;

        this.updateClientState();
        if (this.get_enableLoadOnDemand() && !this._suppressChange)
        {
            var me = this;

            if (this._requestTimeoutID > 0)
            {
                window.clearTimeout(this._requestTimeoutID);
                this._requestTimeoutID = 0;
            }
            if (!this._showDropDownOnTextboxClick)
            {
                this._skipLoadingItems = true;
            }
            if (!this.get_dropDownVisible())
            {
                this.showDropDown();
            }

            this._requestTimeoutID = window.setTimeout(function() { if (me._disposed) { return; } me.requestItems(me.get_text(), false); }, me.get_itemRequestTimeout());
            return;
        }
        
        if ( ! this._suppressChange)
        {
            if (this.get_filter() == Telerik.Web.UI.RadComboBoxFilter.None)
            {
                if (this._shouldHighlight())
                {
                    this.highlightMatches();
                }
            }
            else
            {
                this.highlightAllMatches(this.get_text());
            }
        }
    },
    _onInputPropertyChange: function()
    {
        //If a property is changed via JavaScript (in _onFocus, specifically),
        //ASP.NET AJAX fires the event instead of the browser - get the correct event data.
        if (!event.propertyName)
            event = event.rawEvent;

        if (event.propertyName == "value")
        {
            var text = this.get_text();
            if (this._cachedText != text)
            {
                this._cachedText = text;
                this._onInputChange(event);
            }
        }
    },

    _shouldHighlight: function()
    {
        if (this._lastKeyCode < Telerik.Web.UI.Keys.Space)
        {
            return false;
        }

        if (this._lastKeyCode >= Telerik.Web.UI.Keys.PageUp && this._lastKeyCode <= Telerik.Web.UI.Keys.Del)
        {
            return false;
        }

        if (this._lastKeyCode >= Telerik.Web.UI.Keys.F1 && this._lastKeyCode <= Telerik.Web.UI.Keys.F12)
        {
            return false;
        }

        return true;
    },

    _showDropDown: function(e)
    {
        if (this._firstOpeningOfDropDown)
        {
            this._applyZIndex();
            this._firstOpeningOfDropDown = false;
        }

        if (this.raise_dropDownOpening(e) == true)
        {
            return;
        }
        var animationContainer = this._getAnimationContainer();
        if (!animationContainer)
        {
            return;
        }

        var text = this.get_text();
        if (this.get_emptyMessage() == this.get_text())
        {
            text = "";
        }
        if (this.get_enableLoadOnDemand() && this.get_items().get_count() == 0 && !this._skipLoadingItems)
        {
            this.requestItems(text, false);
        }
        // Hide the animation container until its size is fixed.
        animationContainer.style.visibility = "hidden";
        this.get_dropDownElement().style.visibility = "hidden";
        
        //Avoid the flicker in FireFox by hiding the scrollbars of the rcbScroll element
        //(an element with overflow: auto; displays oddly while being animated).
        //This value is reset after the animation ends.
        if (window.netscape && !window.opera) {
            this.get_childListElementWrapper().style.overflow = "hidden";
        }
        
        this._slide.show();
        this._resetAnimatedElementPosition();
        this._slide.set_direction(this.get_slideDirection());
        // Show the animation container after its size has been fixed.

        try
        {
            //If the input element has visibility: hidden; or display: block; IE throws an exception, so catch it and continue.
            this.get_inputDomElement().focus();
        }
        catch(e) {}
        
        this._onFocus(e);


        this.set_dropDownVisible(true);

        this._positionDropDown();
        var dropDown = this.get_dropDownElement();
        dropDown.style.top = -dropDown.offsetHeight + "px"; //position for animation
        this._skipDropDownPositioning = true;
        this._slide.updateSize();
        this._skipDropDownPositioning = null;
        animationContainer.style.visibility = "visible";
        
        this._slide.expand();
        
        this.raise_dropDownOpened(e);
    },

    _toggleDropDown: function(e)
    {
        if (this.get_dropDownVisible())
        {
            this._hideDropDown(e);
        }
        else
        {
            this._showDropDown(e);
            if (this.get_highlightedItem())
            {
                this.get_highlightedItem().scrollIntoView();
            }
        }
    },

    _hideDropDown: function(e)
    {


        if (!this.get_dropDownVisible())
            return;

        if (this.raise_dropDownClosing(e) == true)
            return;


        this.get_dropDownElement().style.display = "none";

        if (!this._getAnimationContainer())
            return;

        if (window.netscape && !window.opera)
        {
            this.get_childListElementWrapper().scrollTop = 0;
        }

        this._slide.collapse();
        this.set_dropDownVisible(false);

        if (this.get_filter() != Telerik.Web.UI.RadComboBoxFilter.None)
        {
            this._removeEmTagsFromAllItems();
        }

        this.raise_dropDownClosed(e);

    },

    get_dropDownElement: function()
    {
        if (!this._dropDownElement)
        {
            this._dropDownElement = this._getChildElement("DropDown");
        }
        return this._dropDownElement;
    },

    get_inputDomElement: function()
    {
        if (!this._inputDomElement)
        {
            this._inputDomElement = this._getChildElement("Input");
        }
        return this._inputDomElement;
    },

    get_moreResultsBoxMessageElement: function()
    {
        var box = this.get_moreResultsBoxElement();
        var message = $telerik.getFirstChildByTagName(box,
		"span", 0);
        return message;
    },

    get_moreResultsBoxElement: function()
    {
        var box = this._getChildElement("MoreResultsBox");
        return box;
    },

    get_emptyMessage: function()
    {
        return this._emptyMessage;
    },

    set_emptyMessage: function(value)
    {
        if (this._emptyMessage !== value)
        {
            this._emptyMessage = value;
        }
        this._applyEmptyMessage();
    },
    get_imageDomElement: function()
    {
        if (!this._imageDomElement)
        {
            this._imageDomElement = this._getChildElement("Arrow");
        }

        return this._imageDomElement;
    },

    get_slideDirection: function()
    {
        return this._slideDirection;
    },

    set_slideDirection: function(value)
    {
        this._slideDirection = value;
        this._slide.set_direction(value);
    },

    hideDropDown: function()
    {
        this._hideDropDown(null);
    },

    showDropDown: function()
    {
        if (this._enabled) {
            this._selectFirstMatch();        
            this._showDropDown(null);
        }
    },

    toggleDropDown: function()
    {
        if (this._enabled) {
            this._selectFirstMatch();            
            this._toggleDropDown(null);
        }
    },

    _resetAnimatedElementPosition: function()
    {
        var animatedElement = this._getAnimatedElement();
        animatedElement.style.top = "0px";
        animatedElement.style.left = "0px";
    },

    get_readOnly: function()
    {
        return !(this.get_allowCustomText() || this.get_markFirstMatch()) && this.get_filter() == Telerik.Web.UI.RadComboBoxFilter.None;
    },

    _performSelect: function(item, e)
    {
        if (item && item != this.get_selectedItem() && !this.get_enableLoadOnDemand())
        {
            item._select(e);
            return;
        }

        if (item && item == this.get_selectedItem() && this.getLastWord(this.get_text()) != item.get_text() && !this.get_readOnly())
        {
            this.set_text(item.get_text());
            return;
        }

        if (item && item == this.get_selectedItem())
        {
            return;
        }

        if (item && this.get_originalText() != item.get_text())
        {
            item._select(e);
            return;
        }

        //Required to support multiple items with the same text load on demand
        if (item && (!this.get_selectedItem() || this.get_selectedItem().get_value() != item.get_value()))
        {
            item._select(e);
            return;
        }

        if (this.get_originalText() != this.get_text())
        {
            if (this.get_highlightedItem())
            {
                this.get_highlightedItem().unHighlight();
            }
            if (this.raise_textChange(this, e) == true)
            {
                return;
            }
            var command = { Command: "TextChanged" };
            this.postback(command);
        }
    },


    set_value: function(value)
    {
        this._value = value;

        this.updateClientState();
    },

    get_value: function()
    {
        return this._value;
    },

    set_text: function(value)
    {
        value = this.decodeText(value); // Set an expando property "value" in order to be validated correctly.
        this.get_element().value = value;

        this._suppressChange = true;
        var inputElement = this.get_inputDomElement();
        inputElement.value = value;
        this.set_value("");


        if (inputElement.fireEvent && document.createEventObject)
        {
            var eventObject = document.createEventObject();
            inputElement.fireEvent("onchange", eventObject);
        }
        else if (inputElement.dispatchEvent)
        {
            var canBubble = true;
            var eventObject = document.createEvent("HTMLEvents");
            eventObject.initEvent("change", canBubble, true);
            inputElement.dispatchEvent(eventObject);
        }

        this._suppressChange = false;
        this._text = value;
        this.updateClientState();
    },

    get_webServiceSettings: function()
    {
        /// <exclude/>

        return this._webServiceSettings;
    },

    set_webServiceSettings: function(value)
    {
        /// <exclude/>

        var deserializedWebServiceSettings = Sys.Serialization.JavaScriptSerializer.deserialize(value);
        this._webServiceSettings = new Telerik.Web.UI.WebServiceSettings(deserializedWebServiceSettings);
    },

    get_text: function()
    {
        return this.get_inputDomElement().value;
    },

    enable: function()
    {
        this.get_inputDomElement().disabled = false;
        var table = this.get_tableElement();
        if (table != null)
        {
            table.className = "";
        }

        this.set_enabled(true);
        this.enableEvents()
        var itemCount = this.get_items().get_count();
        for (var i = 0; i < itemCount; i++)
        {
            this._children.getItem(i).enable();
        }
    },

    disable: function()
    {
        var table = this.get_tableElement();
        if (table != null)
        {
            table.className = "rcbDisabled";
        }

        this.set_enabled(false);
        this.get_inputDomElement().disabled = "disabled";
        this.disableEvents()
        var itemsCount = this.get_items().get_count();
        for (var i = 0; i < itemsCount; i++)
        {
            this._children.getItem(i).disable();
        }
    },

    set_enabled: function(value)
    {
        this._enabled = value;
        this.updateClientState();
    },

    get_enabled: function()
    {
        return this._enabled;
    },

    disableEvents: function()
    {
        this._fireEvents = false;
    },

    enableEvents: function()
    {
        this._fireEvents = true;
    },
    findItemByText: function(theText)
    {
        var items = this.get_items();
        var itemsCount = items.get_count();

        for (var i = 0; i < itemsCount; i++)
        {
            if (items.getItem(i).get_text() == theText)
            {
                return items.getItem(i);
            }
        }

        return null;
    },

    findItemByValue: function(theValue)
    {
        if (!theValue) return null;

        var items = this.get_items();
        var itemsCount = items.get_count();

        for (var i = 0; i < itemsCount; i++)
        {
            if (items.getItem(i).get_value() == theValue)
            {
                return items.getItem(i);
            }
        }

        return null;
    },

    _getAnimationContainer: function()
    {
        if (!this._animationContainer)
        {
            if (this.get_dropDownElement())
            {
                this._animationContainer = this.get_dropDownElement().parentNode;
            }

        }

        return this._animationContainer;
    },

    highlightPreviousItem: function()
    {
        var items = this.get_visibleItems();

        var currentItem = this.get_highlightedItem();
        
        //In case the drop down has never been opened yet, there is no highlighted Item.
        //However, if there is a selected Item, it will not be highlighted until the drop down is opened.
        if ( ! currentItem) {
            currentItem = this.get_selectedItem();
        }

        var proposedIndex = 0;

        if (currentItem)
        {
            var length = items.length;
            for (var i = 0; i < length; i++)
            {
                if (items[i] == currentItem)
                {
                    proposedIndex = i - 1;
                }
            }

        }

        proposedIndex = this._findPrevAvailableIndex(proposedIndex);

        if (proposedIndex >= 0)
        {
            items[proposedIndex].highlight();
            items[proposedIndex].scrollIntoView();
            var lastSeparatorIndex = this._getLastSeparatorIndex(this.get_text());
            //Append the item text after the last separator
            var textToSet = this.get_text().substring(0, lastSeparatorIndex + 1) + items[proposedIndex].get_text();
            if (this.get_changeText())
            {
                this.set_text(textToSet);
                this.set_value(items[proposedIndex].get_value());
            }

        }
    },

    highlightNextItem: function(letter)
    {
        var items = this.get_visibleItems();

        var currentItem = this.get_highlightedItem();
        
        //In case the drop down has never been opened yet, there is no highlighted Item.
        //However, if there is a selected Item, it will not be highlighted until the drop down is opened.
        if ( ! currentItem) {
            currentItem = this.get_selectedItem();
        }
        
        var proposedIndex = 0;

        if (currentItem)
        {
            var length = items.length;
            for (var i = 0; i < length; i++)
            {
                if (items[i] == currentItem)
                {
                    proposedIndex = i + 1;
                }
            }
        }

        proposedIndex = this._findNextAvailableIndex(proposedIndex, letter);
        if (letter && proposedIndex == items.length)
        {
            proposedIndex = this._findNextAvailableIndex(0, letter);
        }
        if (proposedIndex < items.length)
        {
            items[proposedIndex].highlight();
            items[proposedIndex].scrollIntoView();
            var lastSeparatorIndex = this._getLastSeparatorIndex(this.get_text());
            //Append the item text after the last separator
            var textToSet = this.get_text().substring(0, lastSeparatorIndex + 1) + items[proposedIndex].get_text();

            if (this.get_changeText())
            {
                this.set_text(textToSet);
                this.set_value(items[proposedIndex].get_value());
            }
        }
    },

    findFirstMatch: function(text)
    {
        if (!text) return null;

        var items = this.get_items();
        var itemsCount = items.get_count();

        for (var i = 0; i < itemsCount; i++)
        {
            if (items.getItem(i).get_text().length < text.length)
            {
                continue;
            }

            if (items.getItem(i).get_enabled() == false || items.getItem(i).get_isSeparator())
            {
                continue;
            }

            var match = items.getItem(i).get_text().substring(0, text.length);

            if (!this.get_isCaseSensitive())
            {
                if (match.toLowerCase() == text.toLowerCase())
                {
                    return items.getItem(i);
                }
            }
            else
            {
                if (match == text)
                {
                    return items.getItem(i);
                }
            }
        }

        return null;
    },

    highlightAllMatches: function(text)
    {
        if (this.get_filter() == Telerik.Web.UI.RadComboBoxFilter.None) return;

        if (this.get_highlightedItem())
        {
            this.get_highlightedItem().unHighlight();
        }

        var stext = this.getLastWord(text);

        if (this._getLastSeparator(text) == text.charAt(text.length - 1))
        {
            this._removeEmTagsFromAllItems();
            this.setAllItemsVisible(true);
            return;
        }
        this.get_items().forEach(function(item, text) { item._markText(stext); });
        
        if (this.get_markFirstMatch())
        {
            this.highlightFirstValidMatch();
        }
    },
    
    //Used after Filtering.
    //Highlights the first visible and enabled Item if there is any entered text.
    //Does not set the text of the ComboBox (contrary to the MarkFirstMatch functionality).
    highlightFirstValidMatch : function()
    {
        if (this.get_text().length > 0)
        {
            var visibleItems = this.get_visibleItems();
            var visibleItemsCount = visibleItems.length;
            
            for (var itemIndex = 0; itemIndex < visibleItemsCount; itemIndex++)
            {
                var item = visibleItems[itemIndex];
                
                if (item.get_enabled() == true)
                {
                    item.highlight();
                    
                    return;
                }
            }
        }
    },

    setAllItemsVisible: function(value)
    {

        var value = value;
        this.get_items().forEach(function(item) { item.set_visible(value); });
    },

    _removeEmTagsFromAllItems: function()
    {
        if (this.get_isTemplated() || this.get_filter() == Telerik.Web.UI.RadComboBoxFilter.None)
            return;

        this.get_items().forEach(
            function(item) {
                var itemText = item.get_text();
                item.set_text(itemText); 
                item.get_element().innerHTML = 
                    Telerik.Web.UI.RadComboBox.htmlEncode(itemText); 
            }
        );
    },

    highlightMatches: function()
    {
        if (!this.get_markFirstMatch()) return;

        var text = this.get_text();
        var lastWord = this.getLastWord(text);

        if (this._getLastSeparator(text) == text.charAt(text.length - 1))
        {
            return;
        }

        var matchingItem = this.findFirstMatch(lastWord);

        if (this.get_highlightedItem())
        {
            this.get_highlightedItem().unHighlight();
        }

        if (!matchingItem)
        {
            if (!this.get_allowCustomText() && !this.get_enableLoadOnDemand())
            {
                if (text)
                {
                    var lastSeparatorIndex = this._getLastSeparatorIndex(text);
                    if (lastSeparatorIndex < text.length - 1)
                    {
                        var nText = text.substring(0, text.length - 1);
                        if (nText == "" && $telerik.isSafari)
                        {
                            var me = this;
                            window.setTimeout(function() { me.set_text(nText); }, 0);
                        }
                        else
                        {
                            this.set_text(nText);
                            this.highlightMatches();
                        }

                    }
                }
            }

            return;
        }
        matchingItem.highlight();
        matchingItem.scrollOnTop();

        var lastSeparatorIndex = this._getLastSeparatorIndex(text);
        var newText = text.substring(0, lastSeparatorIndex + 1) + matchingItem.get_text();

        if (text != newText)
        {
            this.set_text(newText);
        }

        this.set_value(matchingItem.get_value());

        var startIndex = lastSeparatorIndex + lastWord.length + 1;
        var endIndex = newText.length - startIndex;

        this.selectText(startIndex, endIndex);

    },

    postback: function(command)
    {
        if (!this._postBackReference)
            return;

        var postbackFunction = this._postBackReference.replace("arguments",
				Sys.Serialization.JavaScriptSerializer.serialize(command));

        eval(postbackFunction);
    },

    _getLastSeparator: function(text)
    {
        if (!this.get_autoCompleteSeparator()) return null

        var lastIndex = this._getLastSeparatorIndex(text);
        return text.charAt(lastIndex);
    },

    getLastWord: function(text)
    {
        var lastSeparatorIndex = -1;
        if (this.get_autoCompleteSeparator() != null)
        {
            lastSeparatorIndex = this._getLastSeparatorIndex(text);
        }
        var lastWord = text.substring(lastSeparatorIndex + 1, text.length);
        return lastWord;
    },

    get_lastWord: function()
    {
        var lastWord = this.getLastWord(this.get_text());

        return lastWord;
    },

    _getLastSeparatorIndex: function(text)
    {
        var lastIndex = -1;

        if (!this.get_autoCompleteSeparator()) return lastIndex;

        for (var i = 0, length = this.get_autoCompleteSeparator().length; i < length; i++)
        {
            var currentSeparator = this.get_autoCompleteSeparator().charAt(i);
            var currentIndex = text.lastIndexOf(currentSeparator);
            if (currentIndex > lastIndex && !this._checkIsThisPartOfWord(currentIndex, currentSeparator))
            {

                lastIndex = currentIndex;

            }
        }

        return lastIndex;
    },

    _checkIsThisPartOfWord: function(index, currentSeparator)
    {
        var word = "";

        if (this.get_selectedItem())
        {
            word = this.get_selectedItem().get_text();
        }

        var currentIndex = word.lastIndexOf(currentSeparator);
        if (currentIndex > -1 && currentIndex == index)
        {
            return true;
        }

        return false;
    },

    selectText: function(startIndex, endIndex)
    {
        if (!this.get_enableTextSelection())
            return;
            
        if (( ! this.get_enableLoadOnDemand()) && 
            (this.get_readOnly()))
            return;
        

        if (this.get_inputDomElement().createTextRange)
        {
            var textRange = this.get_inputDomElement().createTextRange();

            if (startIndex == 0 && endIndex == 0)
            {
                textRange.collapse(true);
                return;
            }
            textRange.moveStart("character", startIndex);
            textRange.moveEnd("character", endIndex);
            textRange.select();
        }
        else
        {
            this.get_inputDomElement().setSelectionRange(startIndex, startIndex + endIndex);
        }
    },


    _childRemoving: function(child)
    {

        var index = child.get_index();
        if (this._itemData)
            Array.remove(this._itemData, this._itemData[index]);

        Telerik.Web.UI.RadComboBox.callBaseMethod(this, "_childRemoving", [child]);
    },

    _childRemoved: function(item, parent)
    {

        var childElement = item.get_element();
        if (item == this.get_selectedItem())
        {
            this.set_selectedItem(null);
            this.set_highlightedItem(null);
            this.set_text("");

        }
        if (parent.get_items().get_count() == 0 && !this._getHeaderElement() && !this._getFooterElement())
        {
            childElement = parent._childListElement;
            parent._childListElement = null;
            //parent.get_element().innerHTML = "";
        }
        if (childElement)
        {
            childElement.innerHTML = "";

            if (childElement.parentNode)
            {
                childElement.parentNode.removeChild(childElement);
            }
            childElement = null;
        }
        Telerik.Web.UI.RadComboBox.callBaseMethod(this, "_childRemoved", [item, parent]);
    },

    _childrenCleared: function(parent)
    {
        this.set_selectedItem(null);
        this.set_highlightedItem(null);

        var childListElement = parent.get_childListElement();
        var itemsCount = parent.get_items().get_count();

        if (childListElement && !this._getHeaderElement() && !this._getFooterElement())
        {
            for (var i = 0; i < itemsCount; i++)
            {
                parent.get_items().getItem(i)._dispose();
            }
            childListElement.innerHTML = "";
            childListElement = null;
        }
        else if (childListElement)
        {
            for (var i = 0; i < itemsCount; i++)
            {
                this._childRemoved(parent.get_items().getItem(i), parent);
            }
        }
    },

    _createChildControls: function()
    {
        this._children = new Telerik.Web.UI.RadComboBoxItemCollection(this);
        Telerik.Web.UI.RadComboBox._createChildControls(this, this._children);
    },

    _ensureChildControls: function()
    {
        if (!this._childControlsCreated)
        {
            this._createChildControls();
            this._childControlsCreated = true;
            if (!this._setSelectedItem)
            {
                this._setSelectedItem = true;
                this._setFirstSelectedItem();
            }
        }

    },

    _createChildListElement: function()
    {
        var childListElement = document.createElement("ul");
        childListElement.className = "rcbList";
        this.get_childListElementWrapper().appendChild(childListElement);

        this._onDropDownClickDelegate = Function.createDelegate(this, this._onDropDownClick);
        $addHandler(this.get_childListElement(), "click", this._onDropDownClickDelegate);

        this._onDropDownHoverDelegate = Function.createDelegate(this, this._onDropDownHover);
        $addHandler(this.get_childListElement(), "mouseover", this._onDropDownHoverDelegate);

        this._cancelDelegate = Function.createDelegate(this, this._cancelEvent);
        $addHandler(this.get_childListElement(), "selectstart", this._cancelDelegate);
        $addHandler(this.get_childListElement(), "dragstart", this._cancelDelegate);

        this._onDropDownOutDelegate = Function.createDelegate(this, this._onDropDownOut);
        $addHandler(this.get_childListElement(), "mouseout", this._onDropDownOutDelegate);

    },

    _setFirstSelectedItem: function()
    {
        //select the first match
        var item = this.findItemByText(this._text);
        if (item && !item.get_isSeparator())
        {
            this.set_selectedItem(item);
        }
    },

    get_childListElement: function()
    {
        if (!this._childListElement)
        {
            var dropDownWrapper = this.get_childListElementWrapper();
            this._childListElement = $telerik.getFirstChildByTagName(dropDownWrapper, "ul", 0);
        }
        return this._childListElement;
    },

    get_childListElementWrapper: function()
    {
        if (!this._childListElementWrapper)
        {
            var wrapper = this.get_dropDownElement();
            if (this._getHeaderElement())
            {
                this._childListElementWrapper = $telerik.getFirstChildByTagName(wrapper, "div", 1);
            }
            else
            {
                this._childListElementWrapper = $telerik.getFirstChildByTagName(wrapper, "div", 0);
            }
        }
        return this._childListElementWrapper;
    },

    _getHeaderElement: function()
    {
        if (this.get_dropDownElement())
        {
            return $telerik.getChildByClassName(this.get_dropDownElement(), "rcbHeader", 0);
        }

        return null;
    },

    _getFooterElement: function()
    {
        if (this.get_dropDownElement())
        {
            return $telerik.getChildByClassName(this.get_dropDownElement(), "rcbFooter", 0);
        }

        return null;
    },

    get_tableElement: function()
    {

        if (!this._tableElement)
        {
            this._tableElement = $telerik.getFirstChildByTagName(this.get_element(), "table", 0);
        }
        return this._tableElement;
    },

    get_expandAnimation: function()
    {
        /// <exclude/>

        return this._expandAnimation;
    },

    set_expandAnimation: function(value)
    {
        /// <exclude/>

        var deserializedAnimationSettings = Sys.Serialization.JavaScriptSerializer.deserialize(value);
        this._expandAnimation = new Telerik.Web.UI.AnimationSettings(deserializedAnimationSettings);
    },

    get_collapseAnimation: function()
    {
        /// <exclude/>

        return this._collapseAnimation;
    },

    set_collapseAnimation: function(value)
    {
        /// <exclude/>

        var deserializedAnimationSettings = Sys.Serialization.JavaScriptSerializer.deserialize(value);
        this._collapseAnimation = new Telerik.Web.UI.AnimationSettings(deserializedAnimationSettings);
    },

    _getAnimatedElement: function()
    {
        if (!this._animatedElement)
        {
            this._animatedElement = this.get_dropDownElement();
        }

        return this._animatedElement;
    },

    get_items: function()
    {
        return this._getChildren();
    },

    get_visibleItems: function()
    {
        var visibleItems = [];
        var childrenCount = this._getChildren().get_count();

        for (var i = 0; i < childrenCount; i++)
        {
            var item = this._getChildren().getItem(i);
            if (item.get_visible())
            {
                Array.add(visibleItems, item);
            }
        }

        return visibleItems;
    },

    set_items: function(value)
    {
        this._children = value;
    },

    get_itemData: function()
    {
        return this._itemData;
    },

    set_itemData: function(value)
    {
        this._itemData = value;
    },
    get_itemRequestTimeout: function()
    {
        return this._itemRequestTimeout;
    },
    set_itemRequestTimeout: function(value)
    {
        this._itemRequestTimeout = value;
    },
    get_appendItems: function()
    {
        return this._appendItems;
    },

    set_appendItems: function(value)
    {
        this._appendItems = value;
    },

    get_selectedItem: function()
    {
        if (!this._setSelectedItem)
        {
            this._setSelectedItem = true;
            this._setFirstSelectedItem();
        }
        return this._selectedItem;
    },

    set_selectedItem: function(value)
    {
        this._selectedItem = value;
    },

    get_selectedIndex: function()
    {
        var selectedItem = this.get_selectedItem();
        if (selectedItem)
        {
            return selectedItem.get_index();
        }
        return this._selectedIndex;
    },

    set_selectedIndex: function(value)
    {
        this._selectedIndex = value;
    },
    get_causesValidation: function()
    {
        return this._causesValidation;
    },

    set_causesValidation: function(value)
    {
        this._causesValidation = value;
    },
    get_closeDropDownOnBlur: function()
    {
        return this._closeDropDownOnBlur;
    },

    set_closeDropDownOnBlur: function(value)
    {
        this._closeDropDownOnBlur = value;
    },
    get_isTemplated: function()
    {
        return this._isTemplated;
    },

    set_isTemplated: function(value)
    {
        this._isTemplated = value;
    },

    get_highlightTemplatedItems: function()
    {
        return this._highlightTemplatedItems;
    },

    set_highlightTemplatedItems: function(value)
    {
        this._highlightTemplatedItems = value;
    },

    get_enableLoadOnDemand: function()
    {
        return this._enableLoadOnDemand;
    },

    set_enableLoadOnDemand: function(value)
    {
        this._enableLoadOnDemand = value;
    },

    get_enableItemCaching: function()
    {
        return this._enableItemCaching;
    },

    set_enableItemCaching: function(value)
    {
        this._enableItemCaching = value;
    },
    
    _setReadOnlyCssClass: function ()
    {
		var trElement = this.get_tableElement().getElementsByTagName("tr")[0];
		
		if (this.get_readOnly())
		{
			Sys.UI.DomElement.addCssClass(trElement, "rcbReadOnly");
		}
		else
		{
			Sys.UI.DomElement.removeCssClass(trElement, "rcbReadOnly");
		}
    },

    get_allowCustomText: function()
    {
        return this._allowCustomText;
    },

    set_allowCustomText: function(value)
    {
        this._allowCustomText = value;
        this._setReadOnlyCssClass();
    },

    get_changeText: function()
    {
        return this._changeText;
    },

    set_changeText: function(value)
    {
        this._changeText = value;
    },
    get_markFirstMatch: function()
    {
        return this._markFirstMatch;
    },

    set_markFirstMatch: function(value)
    {
        this._markFirstMatch = value;
        this._setReadOnlyCssClass();
    },


    get_filter: function()
    {
        return this._filter;
    },

    set_filter: function(value)
    {
        this._filter = value;
    },

    get_enableTextSelection: function()
    {
        return this._enableTextSelection;
    },

    set_enableTextSelection: function(value)
    {
        this._enableTextSelection = value;
    },
    get_originalText: function()
    {
        return this._originalText;
    },

    set_originalText: function(value)
    {
        this._originalText = value;
    },

    get_highlightedItem: function()
    {
        return this._highlightedItem;
    },

    set_highlightedItem: function(value)
    {
        this._highlightedItem = value;
    },

    get_isCaseSensitive: function()
    {
        return this._isCaseSensitive;
    },

    set_isCaseSensitive: function(value)
    {
        this._isCaseSensitive = value;
    },

    get_dropDownVisible: function()
    {
        return this._dropDownVisible;
    },

    set_dropDownVisible: function(value)
    {
        this._dropDownVisible = value;
    },

    get_autoCompleteSeparator: function()
    {
        return this._autoCompleteSeparator;
    },

    set_autoCompleteSeparator: function(value)
    {
        this._autoCompleteSeparator = value;
    },

    get_showMoreMessage: function()
    {
        return this._showMoreMessage;
    },

    set_showMoreMessage: function(value)
    {
        this._showMoreMessage = value;
    },

    get_loadingMessage: function()
    {
        return this._loadingMessage;
    },

    set_loadingMessage: function(value)
    {
        this._loadingMessage = value;
    },

    get_errorMessage: function()
    {
        return this._errorMessage;
    },

    set_errorMessage: function(value)
    {
        this._errorMessage = value;
    },

    set_endOfItems: function(value)
    {
        this._endOfItems = value;
    },

    get_endOfItems: function()
    {
        return this._endOfItems;
    },

    get_clientDataString: function()
    {
        return this._clientDataString;
    },

    set_clientDataString: function(value)
    {

        this._clientDataString = value;
    },

    get_offsetX: function()
    {
        return this._offsetX;
    },

    set_offsetX: function(value)
    {
        this._offsetX = value;
    },

    get_offsetY: function()
    {
        return this._offsetY;
    },

    set_offsetY: function(value)
    {
        this._offsetY = value;
    },
    add_keyPressing: function(eventHandler)
    {
        this.get_events().addHandler("keyPressing", eventHandler);
    },
    remove_keyPressing: function(eventHandler)
    {
        this.get_events().removeHandler("keyPressing", eventHandler);
    },

    raise_keyPressing: function(eventArgs)
    {
        this.raiseEvent("keyPressing", eventArgs);
    },
    add_textChange: function(eventHandler)
    {
        this.get_events().addHandler("textChange", eventHandler);
    },
    remove_textChange: function(eventHandler)
    {
        this.get_events().removeHandler("textChange", eventHandler);
    },

    raise_textChange: function(eventArgs, e)
    {
        var eventArgs = new Telerik.Web.UI.RadComboBoxCancelEventArgs(e);
        this.raiseEvent("textChange", eventArgs);
        return eventArgs.get_cancel();
    },
    add_selectedIndexChanging: function(eventHandler)
    {
        this.get_events().addHandler("selectedIndexChanging", eventHandler);
    },

    remove_selectedIndexChanging: function(eventHandler)
    {
        this.get_events().removeHandler("selectedIndexChanging", eventHandler);
    },

    raise_selectedIndexChanging: function(item, e)
    {
        var eventArgs = new Telerik.Web.UI.RadComboBoxItemCancelEventArgs(item, e);
        this.raiseEvent("selectedIndexChanging", eventArgs);
        return eventArgs.get_cancel();
    },

    add_selectedIndexChanged: function(eventHandler)
    {
        this.get_events().addHandler("selectedIndexChanged", eventHandler);
    },

    remove_selectedIndexChanged: function(eventHandler)
    {
        this.get_events().removeHandler("selectedIndexChanged", eventHandler);
    },

    raise_selectedIndexChanged: function(item, e)
    {
        var eventArgs = new Telerik.Web.UI.RadComboBoxItemEventArgs(item, e);
        this.raiseEvent("selectedIndexChanged", eventArgs);
    },

    add_itemsRequesting: function(eventHandler)
    {
        this.get_events().addHandler("itemsRequesting", eventHandler);
    },

    remove_itemsRequesting: function(eventHandler)
    {
        this.get_events().removeHandler("itemsRequesting", eventHandler);
    },

    add_itemsRequested: function(eventHandler)
    {
        this.get_events().addHandler("itemsRequested", eventHandler);
    },

    remove_itemsRequested: function(eventHandler)
    {
        this.get_events().removeHandler("itemsRequested", eventHandler);
    },

    raise_itemsRequested: function(text, e)
    {
        var eventArgs = new Telerik.Web.UI.RadComboBoxRequestEventArgs(text, e);
        this.raiseEvent("itemsRequested", eventArgs);
    },
    
    add_itemDataBound : function (eventHandler)
	{
		this.get_events().addHandler("itemDataBound", eventHandler);
	},
	
	remove_itemDataBound : function (eventHandler)
	{
		this.get_events().removeHandler("itemDataBound", eventHandler);
	},

    add_dropDownOpening: function(eventHandler)
    {
        this.get_events().addHandler("dropDownOpening", eventHandler);
    },

    remove_dropDownOpening: function(eventHandler)
    {
        this.get_events().removeHandler("dropDownOpening", eventHandler);
    },

    raise_dropDownOpening: function(e)
    {
        var eventArgs = new Telerik.Web.UI.RadComboBoxCancelEventArgs(e);
        this.raiseEvent("dropDownOpening", eventArgs);
        return eventArgs.get_cancel();
    },

    add_dropDownClosing: function(eventHandler)
    {
        this.get_events().addHandler("dropDownClosing", eventHandler);
    },

    remove_dropDownClosing: function(eventHandler)
    {
        this.get_events().removeHandler("dropDownClosing", eventHandler);
    },
    add_dropDownOpened: function(eventHandler)
    {
        this.get_events().addHandler("dropDownOpened", eventHandler);
    },

    remove_dropDownOpened: function(eventHandler)
    {
        this.get_events().removeHandler("dropDownOpened", eventHandler);
    },

    raise_dropDownOpened: function(e)
    {
        var eventArgs = new Telerik.Web.UI.RadComboBoxEventArgs(e);
        this.raiseEvent("dropDownOpened", eventArgs);
    },

    add_dropDownClosed: function(eventHandler)
    {
        this.get_events().addHandler("dropDownClosed", eventHandler);
    },

    remove_dropDownClosed: function(eventHandler)
    {
        this.get_events().removeHandler("dropDownClosed", eventHandler);
    },

    raise_dropDownClosed: function(e)
    {
        var eventArgs = new Telerik.Web.UI.RadComboBoxEventArgs(e);
        this.raiseEvent("dropDownClosed", eventArgs);
    },
    add_itemsRequestFailed: function(eventHandler)
    {
        this.get_events().addHandler("itemsRequestFailed", eventHandler);
    },

    remove_itemsRequestFailed: function(eventHandler)
    {
        this.get_events().removeHandler("itemsRequestFailed", eventHandler);
    },

    raise_itemsRequestFailed: function(text, errorMessage, e)
    {
        var eventArgs = new Telerik.Web.UI.RadComboBoxItemsRequestFailedEventArgs(text, errorMessage, e);
        this.raiseEvent("itemsRequestFailed", eventArgs);
        return eventArgs.get_cancel();
    },

    raise_dropDownClosing: function(e)
    {
        var eventArgs = new Telerik.Web.UI.RadComboBoxCancelEventArgs(e);
        this.raiseEvent("dropDownClosing", eventArgs);
        return eventArgs.get_cancel();
    },

    add_onClientFocus: function(eventHandler)
    {
        this.get_events().addHandler("onClientFocus", eventHandler);
    },

    remove_onClientFocus: function(eventHandler)
    {
        this.get_events().removeHandler("onClientFocus", eventHandler);
    },

    raise_onClientFocus: function(e)
    {
        var eventArgs = new Telerik.Web.UI.RadComboBoxEventArgs(e);
        this.raiseEvent("onClientFocus", eventArgs);
    },

    add_onClientBlur: function(eventHandler)
    {
        this.get_events().addHandler("onClientBlur", eventHandler);
    },

    remove_onClientBlur: function(eventHandler)
    {
        this.get_events().removeHandler("onClientBlur", eventHandler);
    },

    raise_onClientBlur: function(e)
    {
        var eventArgs = new Telerik.Web.UI.RadComboBoxEventArgs(e);
        this.raiseEvent("onClientBlur", eventArgs);
    },

    add_onClientKeyPressing: function(eventHandler)
    {
        this.get_events().addHandler("keyPressing", eventHandler);
    },

    remove_onClientKeyPressing: function(eventHandler)
    {
        this.get_events().removeHandler("keyPressing", eventHandler);
    },

    raise_onClientKeyPressing: function(e)
    {
        var eventArgs = new Telerik.Web.UI.RadComboBoxEventArgs(e);
        this.raiseEvent("keyPressing", eventArgs);
    },
    add_load: function(handler)
    {
        this.get_events().addHandler("load", handler);
    },

    remove_load: function(handler)
    {
        this.get_events().removeHandler("load", handler);
    },

    _logInserted: function(item)
    {
        if (!item.get_parent()._childControlsCreated || !this._enableClientStatePersistence) return;

        this._log.logInsert(item);
    },

    saveClientState: function()
    {
        var logEntriesArray = this._log._logEntries;
        var clientState =
		{
		    logEntries: logEntriesArray,
		    value: this._value,
		    text: this._text,
		    enabled: this._enabled
		};
        return Sys.Serialization.JavaScriptSerializer.serialize(clientState);
    },

    /*------- Load On Demand --------*/

    requestItems: function(text, appendItems)
    {
        if (this._disposed) { return; }
        if ((appendItems) && (this._pendingAjaxRequestsCount > 0)) { return; }        
        this._ensureChildControls();
        text = text.replace(/'/g, "&squote");
        text = encodeURIComponent(text);
        this._ajaxRequest = true;
        var userContext = {};
        this.set_appendItems(appendItems);

        userContext.NumberOfItems = 0;
        if (this.get_appendItems())
            userContext.NumberOfItems = this.get_items().get_count();

        userContext.Text = decodeURIComponent(text);

        var requestingEventArgs = new Telerik.Web.UI.RadComboBoxRequestCancelEventArgs(text, userContext);
        this.raiseEvent("itemsRequesting", requestingEventArgs);

        if (requestingEventArgs.get_cancel())
        {
            this._ajaxRequest = false;
            
            return;
        }

        if (this.get_highlightedItem())
            this.get_highlightedItem().unHighlight();

        if (!this._loadingDiv)
        {
            this._loadingDiv = document.createElement("li");
            this._loadingDiv.className = "rcbLoading";
            this._loadingDiv.id = this.get_id() + "_LoadingDiv";
            this._loadingDiv.innerHTML = this.get_loadingMessage();
            if (!this.get_childListElement())
                this._createChildListElement();

            this.get_childListElement().insertBefore(this._loadingDiv, this.get_childListElement().firstChild);
        }

        this._callbacktext = text;
        this._pendingAjaxRequestsCount++;
        
        if (this.get_webServiceSettings().get_method())
            this._doLoadOnDemandFromWebService(text, userContext);
        else
            this._doLoadOnDemand(text, userContext);
    },

    _doLoadOnDemand: function(text, userContext)
    {

        var numberOfItems = 0;
        if (this.get_appendItems())
            numberOfItems = this.get_items().get_count();

        var command = {
            Command: "LOD",
            Text: text,
            ClientState: this._clientState,
            Context: userContext,
            NumberOfItems: numberOfItems
        };

        var onCallback = Function.createDelegate(this, this._onCallbackResponse);

        var onError = Function.createDelegate(this, this._onErrorReceived);

        if (this.get_enableItemCaching() && this.lodHashTable[text + "$" + numberOfItems] != null)
        {
            this._onCallbackResponse(this.lodHashTable[text + "$" + numberOfItems]);
        }
        else
        {
            WebForm_DoCallback(this._uniqueId,
			Sys.Serialization.JavaScriptSerializer.serialize(command),
			onCallback, text, onError, true);
        }
    },

    _onCallbackResponse: function(response)
    {
        if (this._disposed) { return; }
        
        this._pendingAjaxRequestsCount--;
        
        this.set_selectedItem(null);
        this.set_highlightedItem(null);
        var oldLength = this._children.get_count();
        var text = this.get_text();
        var numberOfItems = 0;
        var receivedText = response.split("_$$_")[4];
        
        if (this._pendingAjaxRequestsCount == 0)
        {            
            if (receivedText != this._callbacktext)
            {
                this.requestItems(this._callbacktext, this.get_appendItems());
                return;
            }
        }

        if (this.get_appendItems())
            numberOfItems = this.get_items().get_count();

        if (this.get_enableItemCaching() && this.lodHashTable[receivedText + "$" + numberOfItems] == null)
            this.lodHashTable[receivedText + "$" + numberOfItems] = response;

        var responseComponents = response.split("_$$_");
        var receivedItemData;
        if (responseComponents[0] == "[]")
            receivedItemData = null;
        else
            receivedItemData = eval(responseComponents[0]);

        if (responseComponents[3] == "True")
            this._endOfItems = true;
        else
            this._endOfItems = false;

        if (this.get_appendItems() && this._itemData && receivedItemData)
            Array.addRange(this._itemData, receivedItemData);
        else
            this._itemData = receivedItemData;

        if (this._loadingDiv)
        {
            if (this._loadingDiv.parentNode)
                this._loadingDiv.parentNode.removeChild(this._loadingDiv);

            this._loadingDiv = null;
        }

        var childListElement = this.get_childListElement();

        if (!childListElement)
            childListElement = this._createChildListElement();

        this._childControlsCreated = true;

        var emptyElement = $telerik.getFirstChildByTagName(childListElement, "div", 0);
        if (emptyElement)
            emptyElement.parentNode.removeChild(emptyElement);

        if (this.get_appendItems())
        {
            var ulElement = document.createElement("ul");
            ulElement.innerHTML = responseComponents[1];
            var childElements = $telerik.getChildrenByTagName(ulElement, "li");

            var itemsLength = childElements.length;

            for (var i = 0; i < itemsLength; i++)
            {
                childListElement.appendChild(childElements[i]);
                this._childControlsCreated = false;
                var item = new Telerik.Web.UI.RadComboBoxItem();
                this._children.add(item);
                item._initialize(receivedItemData[i], childElements[i]);
            }
        }
        else
        {
            this._children.clear();
            childListElement.innerHTML = responseComponents[1];
            this._childControlsCreated = false;
            this._createChildControls();
        }
        
        this._childControlsCreated = true;

        this.set_showMoreMessage(responseComponents[2]);
        this._setUpDropDownAfterRequest(this.get_text(), childListElement, oldLength);
    },
    
    clearCache: function()
    {
        this.lodHashTable = {};
    },

    _setUpScroll: function(endOfItems, childListElement)
    {
        var itemHeight = 22;

        var numberOfItems = this.get_items().get_count();
        if (numberOfItems > 0)
        {
            itemHeight = this.get_items().getItem(0).get_element().offsetHeight;
        }
        if (endOfItems)
        {
            var emptyElement = $telerik.getFirstChildByTagName(childListElement, "div", 0);
            if (emptyElement)
                emptyElement.parentNode.removeChild(emptyElement);
        }
        else
        {
            var emptyElement = document.createElement("div");
            if (this._height == "" && this._maxHeight != "")
                emptyElement.style.height = this._maxHeight + "px";
            else
                emptyElement.style.height = this.get_childListElementWrapper().offsetHeight + "px";
            childListElement.appendChild(emptyElement);
        }

    },

    _onErrorReceived: function(error, text)
    {
        if (this._requestTimeoutID > 0)
        {
            window.clearTimeout(this._requestTimeoutID);
            this._requestTimeoutID = 0;
        }

        var errorMessage = this._extractErrorMessage(error);

        if (this.raise_itemsRequestFailed(text, errorMessage, null) == true)
            return;

        alert(errorMessage);
    },

    _initializeWebServiceLoader: function()
    {
        this._webServiceLoader = new Telerik.Web.UI.WebServiceLoader(this.get_webServiceSettings());
        this._webServiceLoader.add_loadingSuccess(Function.createDelegate(this, this._onWebServiceResponse));
        this._webServiceLoader.add_loadingError(Function.createDelegate(this, this._onWebServiceError));
    },

    _doLoadOnDemandFromWebService: function(text, userContext)
    {
        if (!this._webServiceLoader)
            this._initializeWebServiceLoader();

        var params = { context: userContext };
        var numberOfItems = userContext.NumberOfItems;
        if (this.get_enableItemCaching() && this.lodHashTable[text + "$" + numberOfItems] != null)
            this._addNewItems(text, this.lodHashTable[text + "$" + numberOfItems]);
        else
            this._webServiceLoader.loadData(params, text);
    },

    _onWebServiceResponse: function(sender, eventArgs)
    {
        this._pendingAjaxRequestsCount--;
        
        var response = eventArgs.get_data();
        var text = eventArgs.get_context();

        var numberOfItems = 0;
        if (this.get_appendItems())
            numberOfItems = this.get_items().get_count();

        if (this._pendingAjaxRequestsCount == 0)
        {
            if (text != this._callbacktext)
            {
                this.requestItems(this._callbacktext, this.get_appendItems());
                return;
            }
        }
        
        if (this.get_enableItemCaching())
            this.lodHashTable[text + "$" + numberOfItems] = response;

        this._addNewItems(text, response)
    },

    _addNewItems: function(text, response)
    {
        this.set_selectedItem(null);
        this.set_highlightedItem(null);
        this._childControlsCreated = true;
        var oldLength = this.get_items().get_count();

        if (this._loadingDiv)
        {
            if (this._loadingDiv.parentNode)
                this._loadingDiv.parentNode.removeChild(this._loadingDiv);

            this._loadingDiv = null;
        }

        if (!this.get_appendItems())
            this.clearItems();

        var childListElement = this.get_childListElement();
        if (!childListElement)
            childListElement = this._createChildListElement();

        //Call _setUpScroll with true to remove the 'emptyElement' which causes the scroll.
        if (this._virtualScroll)
            this._setUpScroll(true, childListElement);

        var itemsArray = null;

        if (Array.prototype.isPrototypeOf(response))
        {
            itemsArray = response;
        }
        else
        {
            itemsArray = response.Items;
            this._endOfItems = response.EndOfItems;
            this._showMoreMessage = response.Message;
        }

        this._childControlsCreated = false;

        var html = [];
        for (var i = 0, length = itemsArray.length; i < length; i++)
        {
            var item = new Telerik.Web.UI.RadComboBoxItem();
            var data = itemsArray[i];
            item._loadFromDictionary(data);
            this._children.add(item);
            item._render(html);
        }

        this._childControlsCreated = true;

        if (this.get_appendItems())
            childListElement.innerHTML = childListElement.innerHTML + html.join("");
        else
            childListElement.innerHTML = html.join("");
            
        var raiseItemDataBound = this.get_events().getHandler("itemDataBound");

        var childElements = $telerik.getChildrenByTagName(childListElement, "li");

        for (var i = 0, length = this._children.get_count(); i < length; i++)
        {
            var item = this._children.getItem(i);
            item.set_element(childElements[i]);
            
            if (raiseItemDataBound)
		    {
			    var itemDataBoundEventArgs = new Telerik.Web.UI.RadComboBoxItemDataBoundEventArgs(item, itemsArray[i]);
			    
			    this.raiseEvent("itemDataBound", itemDataBoundEventArgs);
			}
        }

        this._setUpDropDownAfterRequest(text, childListElement, oldLength);
    },

    _setUpDropDownAfterRequest: function(text, childListElement, oldLength)
    {
        if (this._virtualScroll)
            this._setUpScroll(this._endOfItems, childListElement);

        if (this.get_appendItems())
        {
            if (this.get_items().getItem(oldLength + 1) != null)
                this.get_items().getItem(oldLength + 1).scrollIntoView();
        }

        if (this._showMoreResultsBox && this.get_moreResultsBoxMessageElement())
            this.get_moreResultsBoxMessageElement().innerHTML = this.get_showMoreMessage();

        this.raise_itemsRequested(text, null);

        if (this.get_filter() == Telerik.Web.UI.RadComboBoxFilter.None)
        {
            this.highlightMatches();
        }
        else
        {
            this.highlightAllMatches(this.get_text());
        }

        if (this.get_dropDownVisible())
        {
            this._skipDropDownPositioning = true;
            if (this._slide)
                this._slide.updateSize(); // Update the slide to account for the added items.
            this._skipDropDownPositioning = null;

            this._positionDropDown();
        }

        this._ajaxRequest = false;
    },

    _onWebServiceError: function(sender, eventArgs)
    {
        var errorMessage = eventArgs.get_message();
        var text = eventArgs.get_context();

        this._onErrorReceived(errorMessage, text);
    }
}
Telerik.Web.UI.RadComboBox._preInitialize = function(elementId)
{
	var element = $get(elementId);
	if($telerik.isIE)
	{
	    element.style.display="inline";
	}
	if($telerik.isSafari ||$telerik.isOpera)
	{
	    element.style.display="inline-block";
	}
	if($telerik.isFirefox)
	{
	    element.style.display="-moz-inline-stack";
	}
	
}

Telerik.Web.UI.RadComboBox.registerClass('Telerik.Web.UI.RadComboBox', Telerik.Web.UI.ControlItemContainer);


if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();