﻿var SuggestControl = new function() {
    var lastSuggestText = '';
    this.getLastSuggestText = function() {
        return lastSuggestText;
    }
    this.setLastSuggestText = function(value) {
        lastSuggestText = value;
    }

    var selectedSuggest = null;
    this.getSelectedSuggest = function() {
        return selectedSuggest;
    }
    this.setSelectedSuggest = function(value) {
        selectedSuggest = value;
    }
    this.getIsSelected = function() {
        return this.getSelectedSuggest() != null;
    }

    var requestId = 0;
    this.createRequestId = function() {
        requestId++;
        return requestId;
    }
    this.getLastRequestId = function() {
        return requestId;
    }

    var handleKeyUp = true;
    this.getHandleKeyUp = function() {
        return handleKeyUp;
    }
    this.setHandleKeyUp = function(value) {
        handleKeyUp = value;
    }

    this.timerId = null;
}

SuggestControl.preventDefaultBehavior = function(e) {
    if (e.preventDefault) {
        e.preventDefault();
    }
    else {
        e.returnValue = false;
    }
}

SuggestControl.hideSuggest = function() {
    
    this.setSelectedSuggest(null);
    RemoveElement('SuggestControl');
}

SuggestControl.setInputTextToCurrentSuggest = function() {
    var inputField = $get('words');
    var suggest = this.getSelectedSuggest();
    if (suggest.firstChild.innerText != null) {
        inputField.value = suggest.firstChild.innerText;
    }
    else {
        inputField.value = suggest.firstChild.textContent;
    }
}

SuggestControl.cancelSuggestion = function() {
    var inputField = $get('words');
    inputField.value = this.getLastSuggestText();

    SetFocus('words');
    this.hideSuggest();
}

SuggestControl.acceptSelection = function() {
    this.setInputTextToCurrentSuggest();
    SetFocus('words');
    this.hideSuggest();

    document.forms[0].submit();
}

SuggestControl.handleNavigationKeys = function(e) {
    if (e == null)
        e = window.event;

    if (e.shiftKey || e.altKey)
        return;

    var keyId = e.keyCode;

    if (keyId == 38) { //oben
        this.handleKeyUp();
        return;
    }
    else if (keyId == 40) { // unten
        this.handleDownKey();
        this.preventDefaultBehavior(e);
        return;
    }
    else if (keyId == 37) { //links
        return this.handleLeftKey(e);
    }
    else if (keyId == 39) { // rechts
        return this.handleRightKey(e);
    }
    else if (keyId == 27) { //Escape
        this.cancelSuggestion();
    }
}

SuggestControl.updateCallback = function() {
    clearTimeout(SuggestControl.timerId);
    SuggestControl.timerId = null;

    SuggestControl.setHandleKeyUp(true);

    SuggestControl.update(1);
}

SuggestControl.updateWithTimer = function() {
    if (this.timerId != null)
        clearTimeout(this.timerId);
    this.timerId = setTimeout(
        this.updateCallback,
        700
    );
}

SuggestControl.keyUpHandler = function(e) {
    var inputField = $get('words');

    if (e == null)
        e = window.event;

    if (!this.getHandleKeyUp()) {
        return;
    }

    //this.setHandleKeyUp(false);

    if (e.shiftKey || e.altKey)
        return;

    var keyId = e.keyCode;

    if (keyId == 38) {  // KeyUp
        this.handleNavigationKeys(e);
        return;
    }
    else if (keyId == 40) {     // KeyDown
        this.handleNavigationKeys(e);
        return;
    }

    if (this.getLastSuggestText() == inputField.value) {
        return;
    }

    this.setLastSuggestText(inputField.value);
    this.setSelectedSuggest(null);

    this.updateWithTimer();
}

SuggestControl.keyPressHandler = function(e) {
    if (e == null)
        e = window.event;

    this.setHandleKeyUp(false);

    if (e.keyCode == 27) { //Escape
        this.cancelSuggestion();
        return false;
    }

    this.setHandleKeyUp(true);
}

SuggestControl.handleKeyUp = function() {

    var suggestControl = $get('SuggestControl');
    var selectSuggest;

    if (suggestControl == null)
        return;

    if (this.getIsSelected()) {
        selectSuggest = this.getSelectedSuggest().previousSibling;

        if (selectSuggest == null)
            return;
    }
    else {
        var content = $get('suggest-content');
        selectSuggest = content.childNodes[content.childNodes.length - 1];
    }

    this.selectSuggest(selectSuggest);
    //this.setInputTextToCurrentSuggest();
}

SuggestControl.handleDownKey = function() {
    var suggestControl = $get('SuggestControl');
    var selectSuggest;

    if (suggestControl == null)
        return;

    if (this.getIsSelected()) {
        selectSuggest = this.getSelectedSuggest().nextSibling;

        if (selectSuggest == null)
            return;
    }
    else {
        var content = $get('suggest-content');
        selectSuggest = content.childNodes[0];
    }

    this.selectSuggest(selectSuggest);
    //this.setInputTextToCurrentSuggest();
}

SuggestControl.selectSuggest = function(suggest) {
    if (this.getIsSelected()) {
        this.getSelectedSuggest().className = '';
    }

    suggest.className = 'selected';
    suggest.getElementsByTagName('A')[0].focus();
    this.setSelectedSuggest(suggest);
}

SuggestControl.handleLeftKey = function(e) {
    var suggestControl = $get('SuggestControl');
    var paging = $get('suggest-paging');

    if (suggestControl == null || !this.getIsSelected() || paging == null) {
        return false;
    }

    var firstPagingElement = paging.getElementsByTagName('LI')[0];

    if (firstPagingElement.className != 'previous') {
        return false;
    }

    var previousLink = firstPagingElement.getElementsByTagName('A')[0];
    previousLink.onclick();

    var content = $get('suggest-content');
    selectSuggest = content.childNodes[0];
    this.selectSuggest(selectSuggest);
    
    return true;
}

SuggestControl.handleRightKey = function(e) {
    var suggestControl = $get('SuggestControl');
    var paging = $get('suggest-paging');

    if (suggestControl == null || !this.getIsSelected() || paging == null) {
        return false;
    }

    var pagingElements = paging.getElementsByTagName('LI');
    var lastPagingElement = pagingElements[pagingElements.length - 1];

    if (lastPagingElement.className != 'next') {
        return false;
    }

    var nextLink = lastPagingElement.getElementsByTagName('A')[0];
    nextLink.onclick();

    var content = $get('suggest-content');
    selectSuggest = content.childNodes[0];
    this.selectSuggest(selectSuggest);
    
    return true;
}

SuggestControl.update = function(pageNumber) {
    if (this.getLastSuggestText() == '') {
        SetFocus('words');
        this.hideSuggest();
        return;
    }
    var requestId = this.createRequestId();
    SuggestControl.setSelectedSuggest(null);

    // Text encoden
    //var filteredExpression = escape(this.getLastSuggestText());
    var filteredExpression = this.getLastSuggestText();

    // Falls nur Whitespaces eingegeben wurden, den AJAX-Request unterbinden
    var withoutWhitespace = trim(filteredExpression);
    if (withoutWhitespace.length <= 0) {
        return;
    }

    //LoadXml('7', null, 'words=' + this.getLastSuggestText() + "&page=" + pageNumber, null, null, false, function(executor, eventArgs) { SuggestControl.onXmlLoaded(executor, eventArgs, requestId); });
    LoadXml('7', null, 'words=' + filteredExpression + "&page=" + pageNumber, null, null, false, function(executor, eventArgs) { SuggestControl.onXmlLoaded(executor, eventArgs, requestId); });

    return;
}

SuggestControl.onXmlLoaded = function(executor, eventArgs, requestNumber) {
    if (requestNumber != this.getLastRequestId())
        return;

    OnLoadedXml(executor, eventArgs);

    var wasSelected = SuggestControl.getIsSelected();
    SuggestControl.setSelectedSuggest(null);
    if (wasSelected) {
        SuggestControl.handleDownKey();
    }

    var suggestContent = $get('suggest-content');
    if (suggestContent.getElementsByTagName('LI').length == 0) {
        this.hideSuggest();
    }
}

/**
* Der Hilfe Button
*/
SuggestControl.showHelp = function() {
    ShowHelp('suggestcontrol');
}


/* Kopiert und angepasst anhand von http://blog.josh420.com/archives/2007/11/determine-if-any-other-outside-element-was-clicked-with-javascript.aspx */

function clickedOutsideElement(elemId, evt) {

    var theElem = "";

    if (window.event)
        theElem = getEventTarget(window.event);
    else
        theElem = getEventTarget(evt);

    while (theElem != null) {
        if (theElem.id == elemId)
            return false;

        theElem = theElem.parentNode;
    }

    return true;
}

function getEventTarget(evt) {
    var targ = (evt.target) ? evt.target : evt.srcElement;

    if (targ != null) {
        if (targ.nodeType == 3)
            targ = targ.parentNode;
    }

    return targ;
}

document.onclick = function(evt) {
    if (clickedOutsideElement('SuggestControl', evt))
        SuggestControl.hideSuggest();
}

/* Hilfsfunktion zum Herausfiltern von Whitespaces */
function trim(str) {
    while (str.substring(0, 1) == ' ') str = str.substring(1, str.length);
    while (str.substring(str.length - 1, str.length) == ' ') str = str.substring(0, str.length - 1);
    return str;
}