﻿function AC_OnLocationChange(sender) {
	if (typeof Location_OnChange == 'function')
		Location_OnChange(sender);
}

function AC_OnLocationError(sender, type) {
	if (typeof Location_OnError == 'function') {
		var error = { Type: type, Title: "Unhandled Error", Message: "Unhandled Error"};
		switch (type) {
			case 'notfound':
				error.Title = sender.appearance.ErrorNoTextTitle;
				error.Message = sender.appearance.ErrorNoTextMsg;
				break;
			case 'multiple':
				error.Title = sender.appearance.ErrorMultipleMatchesTitle.replace("{0}", sender.get_text());
				error.Message = sender.appearance.ErrorMultipleMatchesMsg.replace("{0}", sender.get_text());
				break;
			case 'bestmatch':
				error.Title = sender.appearance.ErrorBestAlphaMatchesTitle.replace("{0}", sender.get_text());
				error.Message = sender.appearance.ErrorBestAlphaMatchesMsg.replace("{0}", sender.get_text());
				break;
		}		
		Location_OnError(sender, error);
	}
}

function AC_Load(sender, eventArgs) {
    sender.hasResults = false;
    sender.enforceMinimumCharactersRule = true;
    sender.appearance = get_LACappearance();
    sender.set_emptyMessage(sender.appearance.EmptyMessage);
    sender.hiddenValueField = $get(sender.get_id().replace("rcb", "hid"));
    sender.hiddenTextField = $get(sender.get_id().replace("rcb", "hid") + "Text");
    sender.invalidMsg = $get(sender.get_id().replace("rcb", "lbl"));
    sender.invalidDiv = $get(sender.get_id().substring(sender.get_id().indexOf("rcb"), sender.get_id().length).replace("rcb", "div"));
    sender.recursiveSearching = false;
    sender.type = "auto-complete";
    sender.id = sender.get_id();

    if (sender.get_text() != sender.get_emptyMessage) {
        if (sender.get_items().get_count() == 0) {
            if (sender.hiddenValueField.value != "") {
                var comboItem = new Telerik.Web.UI.RadComboBoxItem();
                comboItem.set_text(sender.get_text());
                comboItem.set_value(sender.hiddenValueField.value);
                sender.get_items().add(comboItem);
                comboItem.select();
            }
        }
    }
}

function AC_SelectedIndexChanged(sender, eventArgs) {
    sender.hiddenValueField.value = eventArgs.get_item().get_value();
    sender.hiddenTextField.value = eventArgs.get_item().get_text();
    AC_SetInvalidMessage(sender, "");    
    AC_OnLocationChange(sender);
}

function AC_TextChange(sender, eventArgs) {
    if(sender.get_text().length == 0) {
        AC_HideToggleImage(sender);
        AC_SetInvalidMessage(sender, "");
        sender.hiddenValueField.value = "";
        sender.hiddenTextField.value = "";
        sender.clearItems();
        AC_OnLocationChange(sender);
    }
}

function AC_DropDownOpening(sender, eventArgs) {
    setDropDownWidth(sender);
    eventArgs.set_cancel(!sender.hasResults || (sender.get_text().length < 2));
}

function AC_ItemsRequesting(sender, eventArgs) {
    if (sender.get_appendItems() && sender.get_endOfItems()) {
        eventArgs.set_cancel(true);
        return;
    }
    
    if (sender.enforceMinimumCharactersRule && (sender.get_text().length < 2)) {
        eventArgs.set_cancel(true);
    }
}

function AC_ShowToggleImage(sender){
    var imageContainer = sender.get_imageDomElement().parentNode;
    imageContainer.className = imageContainer.className.replace(" rcbArrowCellHidden", "");
}

function AC_HideToggleImage(sender){
    var imageContainer = sender.get_imageDomElement().parentNode;
    if(imageContainer.className.indexOf(" rcbArrowCellHidden") == -1){
        sender.get_imageDomElement().parentNode.className += " rcbArrowCellHidden";
    }
}

function AC_ItemsRequested(sender, eventArgs) {
    sender.hasResults = (sender.get_items().get_count() > 0);
    sender.resultsText = sender.get_text();
    if(sender.get_items().get_count() == 1){sender.get_items().getItem(0).select();}
    
    if (sender.hasResults) {
        setDropDownWidth(sender);
        AC_ShowToggleImage(sender);
        resultsMsg = sender.get_moreResultsBoxMessageElement();
        var results = resultsMsg.innerHTML.split("|");
        var template = sender.appearance.ResultsMsg;
        resultsMsg.innerHTML = template.replace("{0}", results[0]).replace("{1}", results[1]);
        if (results[0] != results[1]) {
            resultsMsg.innerHTML = resultsMsg.innerHTML + sender.appearance.MoreMsg;
        }

        if (!sender.enforceMinimumCharactersRule) {
            sender.enforceMinimumCharactersRule = true;
            sender.get_inputDomElement().disabled = "";
        }
        if (!sender.get_dropDownVisible()) {
            sender.showDropDown();
        }
    }
    else {
        if (sender.get_dropDownVisible()) {
            sender.hideDropDown();
        }
        AC_HideToggleImage(sender);
    }

    var wsSettings = sender.get_webServiceSettings();
    if (sender.recursiveSearching) {
        wsSettings.set_method(wsSettings.get_method().replace("Recursive", ""))
        sender.recursiveSearching = false;
        if (sender.hasResults) {
            AC_SetInvalidMessage(sender, sender.appearance.BestAlphaMatches + "'" + sender.get_inputDomElement().value + "'");
            setDropDownWidth(sender);
            sender.hideDropDown();
            AC_ShowToggleImage(sender);
        }
        else {
			AC_SetInvalidMessage(sender, sender.appearance.NoMatches + "'" + sender.get_inputDomElement().value + "'");
            sender.hideDropDown();
            AC_HideToggleImage(sender);
        }
    }
}

function AC_SetInvalidMessage(sender, message) {
	sender.invalidMsg.innerHTML = message;
	getParent(sender.invalidMsg, "DIV").style.display = (message == "") ? 'none' : 'block';
}

function AC_Blur(sender, eventArgs) {
}

function AC_DropDownOpened(sender, eventArgs) {
    setDropDownWidth(sender);
}

function AC_Validate(sender, errors) {

	if (sender.get_text() == sender.appearance.EmptyMessage) {
		sender.hiddenValueField.value = "";
        sender.hiddenTextField.value = "";
        sender.clearItems();
		AC_OnLocationError(sender, 'notfound');
		AC_SetInvalidMessage(sender, sender.appearance.NoText);
        return false;
    }
        
    if (!sender.get_selectedItem()) {
        
        if (sender.hasResults) {
            var itemMatch = sender.findItemByText(sender.get_text());
            if (itemMatch) {
                itemMatch.select();
                return true;
            }
            else {
				AC_OnLocationError(sender, 'multiple');
				AC_SetInvalidMessage(sender, sender.appearance.MultipleMatches + "'" + sender.get_text() + "'");
                AC_ShowToggleImage(sender);
                return false;
            }
        }
        else {
            var wsSettings = sender.get_webServiceSettings();
            if (sender.get_text().length > 0 && sender.get_text() != sender.appearance.EmptyMessage) {
                sender.recursiveSearching = true;
                AC_OnLocationError(sender, 'bestmatch');
                if (wsSettings.get_method().indexOf("Recursive") == -1)
					wsSettings.set_method(wsSettings.get_method().replace("Get", "GetRecursive"));
                sender.requestItems(sender.get_text(), false);
                return false;
            }
            return false;
        }
        return false;
    }
    return true;
}

function getParent(sender, tagName) {
	var parent = sender.parentNode;
	while (parent && (parent.tagName != tagName))
    	parent = parent.parentNode;
    	
   return parent;
}

function getMaxItemWidth(comboBox) {
    var dropDownQuery = $telerik.$(comboBox.get_dropDownElement());
    var fontSize = dropDownQuery.css("fontSize");
    var fontFamily = dropDownQuery.css("fontFamily");

    var spanQuery =
        $telerik.$("<span></span>")
            .css({
                position: "absolute",
                visibility: "hidden",
                fontFamily: fontFamily,
                fontSize: fontSize
            })
            .appendTo("body");

    var maxWidth = 0;

    for (var ix = 0; ix < comboBox.get_items().get_count(); ix++) {
        var itemText = comboBox.get_items().getItem(ix).get_text();

        spanQuery.text(itemText);
        var width = spanQuery.width();

        if (width > maxWidth) {
            maxWidth = width;
        }
    }

    spanQuery.remove();

    if ($telerik.$(comboBox.get_childListElement()).height() > dropDownQuery.height()) {
        maxWidth += Telerik.Web.UI.RadComboBox._getScrollBarWidth();
    }

    return maxWidth + 27;
}

function setDropDownWidth(comboBox) {
    var maxItemWidth = getMaxItemWidth(comboBox);
    if (maxItemWidth > 175) {
        (function(dropDownElement, width) {
            setTimeout(
                function() {
                    dropDownElement.style.width = width + "px";
                },
                20);
        })(comboBox.get_dropDownElement(), maxItemWidth);
    }
}  
