﻿$.fn.textBoxSuggestionList = function (options) {
    var url = options.url;
    var offerText = options.offerText;
    var clearText = options.clearText;
    
    var _this = $(this);
    var mc = options.maxCount;
    var contextKeyCallback = options.contextKeyCallback;
    var selectedItem = null;
    //var recepientsIds = $('.item-picker-selected-items:first', _this);
	$(document).click(function(e){
		$('.suggestion-list:first', _this).html('');
        $('.suggestion-list:first', _this).hide();
	});
    $('input[type="text"]:first', _this).keypress(function (e) {
        if (e.which == 13) {
			var selectedItem = $('.suggestion-list:first .list-view-row[data-isSelected=true]', _this);
			if (selectedItem == null || $(selectedItem).attr('data-rowIndex') == null) {
                    return true;
			}
            return false;
        }
        if (e.which == 44) {
            return false;
        }
    });
	var handleHighlightedItem = function(input, scope, offerText, clearText){//offerText = Возможно вы имели ввиду:;clearText = +Есть ещё результаты по вашему запросу. Пожалуйста уточните, чтобы сузить поиск.
		var val = $(scope).html();
		
		val = val.replace(/(<.*?>)/ig,"");
		val = jQuery.trim(val);
		//alert(val.substr(0, offerText.length));
		if(val.substr(0, offerText.length) == offerText){
			val = val.replace(offerText, '');
			//alert(val);
			//val = val.replace(' ?', '');
			jQuery.trim(val);
			$(input).val(val);
			$(input).simulate("keydown", { keyCode: 32 });
			$(input).simulate("keydown", { keyCode: 8 });
			return;
		}
		if(val.substr(0, 99) == clearText)
		{
			$(input).val('');
			return;
		}
		$('.search-body input:first').val(val);
	};
    $('input[type="text"]:first', _this).keydown(function (e) {

       var fieldValue = $(this);
        
	   $('.suggestion-list:first .list-view-row .suggestion').each(function(e){
			$(this).removeClass('selected-suggestion');
	    });
        var selectedItem = $('.suggestion-list:first .list-view-row[data-isSelected=true]', _this);
        if(selectedItem == null || $(selectedItem).html() == null || $(selectedItem).html() == ''){
			selectedItem = $('.suggestion-list:first .list-view-row:first', _this);
        }
        switch (e.which) {
            case 27: //esc
                $('.suggestion-list:first', _this).html('');
                $('.suggestion-list:first', _this).hide();
                return false;
            case 40:
                //down
                if (selectedItem != null && $(selectedItem).attr('data-rowIndex') != null) {
                    selectedItem = $(selectedItem).next();
                    $(selectedItem).attr('data-isSelected', true);
                    $('.suggestion', selectedItem).addClass('selected-suggestion');
                }
                handleHighlightedItem(fieldValue, $('.suggestion', selectedItem), offerText, clearText);
                break;
            case 38:
                //up
                if (selectedItem != null && $(selectedItem).attr('data-rowIndex') != null) {
                    
                    selectedItem = $(selectedItem).prev();
                    $(selectedItem).attr('data-isSelected', true);
                    $('.suggestion', selectedItem).addClass('selected-suggestion');
                }
                handleHighlightedItem(fieldValue, $('.suggestion', selectedItem), offerText, clearText);
                break;
            case 13: //enter
                selectedItem = $('.suggestion-list:first  .list-view-row[data-isSelected=true]', _this);
                if (selectedItem == null || $(selectedItem).attr('data-rowIndex') == null) {
                    return true;
                }
                $(fieldValue).val($.trim($('.suggestion', selectedItem).html()));
                $('.suggestion-list:first ', _this).html('');
                $('.suggestion-list:first', _this).hide();
                return false;
            default:
				var ck = contextKeyCallback();
                
                if ($(fieldValue).val().length > 1) {
                    $.ajax({
                        type: "POST",
                        url: url, 
                        data: {contextKey: ck, searchTerm: $(this).val(), maxCount: mc},
                                error: function () {
                                   alert('Error has been occured while getting more entries. Please try again later.');
                               },
                        success: function (data) {
                            if ($('.list-view-row', data).length > 0) {
                                $('.suggestion-list:first ', _this).html(data);
                                $('.suggestion-list:first', _this).slideDown(500);
								
								$('.suggestion-list:first .suggestion', _this).hover(function(e){
									$(this).attr('data-isSelected', true);
									$(this).addClass('selected-suggestion');
									$(this).css('cursor', 'pointer');
								},
								function(e){
									$(this).attr('data-isSelected', false);
									$(this).removeClass('selected-suggestion');
									$(this).css('cursor', 'default');
								});
								$('.suggestion-list:first .suggestion', _this).click(function(e){
									 $(fieldValue).val($.trim($(this).html()));
									 $('.suggestion-list:first ', _this).html('');
									 $('.suggestion-list:first', _this).hide();
								});
                            }
                        }
                    });
                }
                else if ($(this).val().length < 2) {
                    $('.suggestion-list:first ', _this).html('');
                    $('.suggestion-list:first', _this).hide();
                }
        }
        if (selectedItem == null || $(selectedItem).attr('data-rowIndex') == null) {
            selectedItem = $('.suggestion-list:first  .list-view-row:first', _this)
        }
        $(selectedItem).addClass('selected');
        $(selectedItem).attr('data-isSelected', true);
        $('.suggestion-list:first  .list-view-row', _this).each(function (e) {
            if ($(this).attr('data-rowIndex') != $(selectedItem).attr('data-rowIndex')) {
                $(this).removeClass('selected');
                $(this).attr('data-isSelected', false);
            }
        });
    });
}
