﻿(function($) {
    $.widget("ui.combobox", {
        _create: function() {              
            var self = this,
					select = this.element.hide(),
					selected = select.children(":selected"),
					value = selected.val() ? selected.text() : "";
			var elementCss = $(this.element).attr('class'); // Added by ADT
            var input = this.input = $("<input>")
					.insertAfter(select)
					.val(value)
					.autocomplete({
					    delay: 0,
					    minLength: 0,
					    source: function(request, response) {
					        var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
					        response(select.children("option").map(function() {
					            var text = $(this).text();
					            if (this.value && (!request.term || matcher.test(text)))
					                return {
					                    label: text.replace(
											new RegExp(
												"(?![^&;]+;)(?!<[^<>]*)(" +
												$.ui.autocomplete.escapeRegex(request.term) +
												")(?![^<>]*>)(?![^&;]+;)", "gi"
											), "<strong>$1</strong>"),
					                    value: text,
					                    option: this
					                };
					        }));
					    },
					    // === Added By ADT
					    open: function() {
					       var DropList = ".ui-autocomplete";
					       var ListItem = "ul.ui-autocomplete li a"
					       
					       $(DropList).each(function(){
                                $(this).removeClass('css-combobox-overflow');
                                
                                var CurrentWidth = $(this).width();
                                var CurrentHeight = $(this).height();

                                if( (CurrentHeight > 150) && (!($(input).hasClass('no-overflow'))) ){
                                    $(this).width(CurrentWidth + 20);
                                    $(this).addClass('css-combobox-overflow');
                                }
                                
                                var currentValue = $(input).val();
                                $(ListItem).each(function(){
                                    var listItem = $(this).html();
					                listItem = listItem.replace(/<\/?[a-z][a-z0-9]*[^<>]*>/ig, '');
    					            
					                if(currentValue == listItem){
					                    $(this).addClass('selected');
					                }
					            });
                            });
                            
                            $(ListItem).hover(function(){
                                $(ListItem).removeClass('selected');
                            });
					    },
					    // === End
					    select: function(event, ui) {
					        ui.item.option.selected = true;
					        self._trigger("selected", event, {
					            item: ui.item.option
					        });
					        
					        // === Added By ADT
					        var elementID = self.element.attr('id');
					        
					        if($('#' + elementID + '[onchange*="doPostBack"]').length != 0)
					        {
                                setTimeout('__doPostBack(\'' + self.element + '\',\'\')', 0);    
                            }
                            // === End
					    },
					    change: function(event, ui) {
					        if (!ui.item) {
					            var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex($(this).val()) + "$", "i"),
									valid = false;
					            select.children("option").each(function() {
					                if ($(this).text().match(matcher)) {
					                    this.selected = valid = true;
					                    return false;
					                }
					            });
					            if (!valid) {
					                // remove invalid value, as it didn't match anything
					                $(this).val("");
					                select.val("");
					                input.data("autocomplete").term = "";
					                return false;
					            }
					        }
					    }
					})
					//.addClass("ui-widget ui-widget-content ui-corner-left");
					.addClass("ui-widget ui-widget-content " + elementCss); // Modified by ADT

            input.data("autocomplete")._renderItem = function(ul, item) {
                return $("<li></li>")
						.data("item.autocomplete", item)
						.append("<a>" + item.label + "</a>")
						.appendTo(ul)
						.addClass(elementCss); // Added by ADT 
            };

            this.button = $("<button type='button'>&nbsp;</button>")
					.attr("tabIndex", -1)
					.attr("title", "Show All Items")
					.insertAfter(input)
					.button({
					    icons: {
					        /*primary: "ui-icon-triangle-1-s"*/
					    },
					    text: false
					})
					.removeClass("ui-corner-all")
					.addClass("ui-corner-right ui-button-icon " + elementCss) // Modified by ADT
					.click(function() {
					    // close if already visible
					    if (input.autocomplete("widget").is(":visible")) {
					        input.autocomplete("close");
					        return;
					    }

					    // work around a bug (likely same cause as #5265)
					    $(this).blur();

					    // pass empty string as value to search for, displaying all results
					    input.autocomplete("search", "");
					    input.focus();
					});
        },

        destroy: function() {
            this.input.remove();
            this.button.remove();
            this.element.show();
            $.Widget.prototype.destroy.call(this);
        }
    });
})(jQuery);
