﻿var g_strShowIntelliseHandle = "";
var g_objIntellisenseParent = null;
var g_objIntellisenseElement = null;
var g_nActiveMenuItem = -1;
var IE = true;

function OnValueKeyDown(e) {
    e = !e ? window.event : e;

    var nKey = getKeyCode(e);

    g_objIntellisenseParent = getEventTarget(e);

    if (nKey == 32 || nKey == 187 || nKey == 188 || nKey == 190) {
        if (__isFireFox) {
            e.stopPropagation();
            e.preventDefault()
        }
        else {
            e.cancelBubble = true;
            e.returnValue = null;
        }
    }
    else if ( nKey == 40 ) // DOWN KEY
    {
        g_objIntellisenseElement = document.getElementById( "activeintellisensemenu" );
        if ( !g_objIntellisenseElement ) {
            ShowIntellisenseMenu();
        }
        
        SetActiveIntellisenseMenuItem( ++g_nActiveMenuItem, false );
    }
    else if ( nKey == 38 && g_objIntellisenseElement ) // UP KEY
    {
        SetActiveIntellisenseMenuItem( --g_nActiveMenuItem, true );
    }
    else if ( nKey == 9 || nKey == 13 ) // TAB
    {
        clearTimeout(g_strShowIntelliseHandle);
        SelectActiveIMenuItem();

        if (nKey == 13) {
            if (__isFireFox) {
                e.stopPropagation();
                e.preventDefault()
            }
            else {
                e.cancelBubble = true;
                e.returnValue = null;
            }
        }
    }
}


function OnValueKeyUp(e) {
    clearTimeout(g_strShowIntelliseHandle);

    g_objIntellisenseParent = getEventTarget(e);

    if (!g_objIntellisenseParent)
        return;

    var nKey = getKeyCode(e);
    if (nKey == 8) {
        RemoveIntellisenseMenu();
    }
    else if (nKey == 13) {
        if (g_objIntellisenseElement) {
            SelectActiveIMenuItem();
            if (__isFireFox) {
                e.stopPropagation();
                e.preventDefault()
            }
            else {
                e.cancelBubble = true;
                e.returnValue = null;
            }
        }

        return false;
    }

    var strTypedValue = (__isFireFox ? g_objIntellisenseParent.textContent.toLowerCase() : g_objIntellisenseParent.innerText.toLowerCase());
    if (strTypedValue.length > 50) {
        alert('Du kan maksimalt indtaste 50 tegn!');
        strTypedValue = strTypedValue.substring(0, 50);
        if (__isFireFox ) {
            g_objIntellisenseParent.textContent = strTypedValue;
        }
        else {
            g_objIntellisenseParent.innerText = strTypedValue;
        }
    }


    // Filter the existing intellisense menu
    if (g_objIntellisenseElement) {

        if (nKey != 37 && nKey != 38 && nKey != 39 && nKey != 40) // Arrows
        {
            var nChangeSelectedItem = null;
            for (var i = 0; i < g_objIntellisenseElement.childNodes.length; i++) {
                var objItem = g_objIntellisenseElement.childNodes.item(i);
                var strItemText = (__isFireFox ? objItem.textContent : objItem.innerText);

                if (strItemText.toLowerCase().substring(0, strTypedValue.length) != strTypedValue) {
                    if (g_objIntellisenseElement.childNodes.item(i).className == "intellisense_menuitem_active") {
                        // Remove the focus to another menu item
                        nChangeSelectedItem = i - 1;
                    }

                    g_objIntellisenseElement.childNodes.item(i).parentNode.removeChild(g_objIntellisenseElement.childNodes.item(i));
                    i--; // Backup the index because we removed a child
                }
            }
        }

        g_objIntellisenseElement.style.height = "" + Math.min( 350, g_objIntellisenseElement.childNodes.length * 22 ) + "px";
        if (g_objIntellisenseElement.childNodes.length == 0) {
            RemoveIntellisenseMenu();
        }
        else {
            if (nChangeSelectedItem) {
                SetActiveIntellisenseMenuItem(nChangeSelectedItem);
            }
        }
    }

    if (strTypedValue.length > 0) {
        g_strShowIntelliseHandle = setTimeout("ShowIntellisenseMenu()", 100);
    }
}


function OnValueFocus(e) {
    g_objIntellisenseParent = getEventTarget(e);

    if (g_objIntellisenseParent != null && g_objIntellisenseParent.OnlyAllowListValues == "True") {
        g_objIntellisenseParent.style.backgroundColor = "#CC99CC";
        g_objIntellisenseParent.setAttribute("validate", "true");
    }
}

function OnValueBlur()
{
    // If focus is removed, and user entered something, we must save it in the hidden fields
    if (!g_objIntellisenseParent)
        return;

    var strText = (__isFireFox ? g_objIntellisenseParent.textContent : g_objIntellisenseParent.innerText);
    
    // Force first letter upper case
    if (strText.length > 0) {
        strText = strText.substring(0, 1).toUpperCase() + (strText.length > 1 ? strText.substring(1) : "");
    }

    var objHiddenValue = document.getElementById(g_objIntellisenseParent.getAttribute("HiddenValue"));

    if (strText != "") {
        if (objHiddenValue.getAttribute("value") != strText) {
            if (g_objIntellisenseParent.getAttribute("OnlyAllowListValues") == "True") {

                g_objIntellisenseParent.style.backgroundColor = "#ff6666";
                g_objIntellisenseParent.setAttribute("validate", "false");

                // Only existing list values are allowed, make sure the entered value isn't
                // remembered in the hidden values
                objHiddenValue.setAttribute("value", "");
                document.getElementById(g_objIntellisenseParent.getAttribute("HiddenValueId")).setAttribute("value", "");
            }
            else {
                // New values are allowed, so we set the hidden values
                objHiddenValue.setAttribute("value", strText);
                document.getElementById(g_objIntellisenseParent.getAttribute("HiddenValueId")).setAttribute("value", "");
            }
        }
        else {
            g_objIntellisenseParent.style.backgroundColor = "#CC99CC";
            g_objIntellisenseParent.setAttribute("validate", "true");
        }
    }
    else {
        /* Field is empty - set hidden values respectively */
        objHiddenValue.setAttribute("value", "");
        document.getElementById(g_objIntellisenseParent.getAttribute("HiddenValueId")).setAttribute("value", "");
    }
}

function SelectActiveIMenuItem()
{
    if ( g_objIntellisenseElement )
    {
        if ( g_nActiveMenuItem > -1 && g_nActiveMenuItem < g_objIntellisenseElement.childNodes.length ) {

            var strText = "";
            if (__isFireFox) {
                strText = g_objIntellisenseElement.childNodes.item(g_nActiveMenuItem).textContent;
                g_objIntellisenseParent.textContent = strText;
            }
            else {
                strText = g_objIntellisenseElement.childNodes.item(g_nActiveMenuItem).innerText;
                g_objIntellisenseParent.innerText = strText;
            }

            // Set the value of the existing choice in the hidden field - so we can access it on post back
            document.getElementById(g_objIntellisenseParent.getAttribute("HiddenValue")).setAttribute("value", strText);
            
            var strDataID = g_objIntellisenseElement.childNodes.item( g_nActiveMenuItem ).getAttribute( "dataid" );
            document.getElementById(g_objIntellisenseParent.getAttribute("HiddenValueId")).setAttribute("value", strDataID);

            g_objIntellisenseParent.style.backgroundColor = "#CC99CC";
            g_objIntellisenseParent.setAttribute("validate", "true");
        }
        else if ( g_objIntellisenseElement.childNodes.length == 1 ) {
            var strFirstItemText = "";
            var strTypedText = "";
            if ( __isFireFox )
            {
                strFirstItemText = g_objIntellisenseElement.childNodes.item( 0 ).textContent;
                strTypedText = g_objIntellisenseParent.textContent;
            }
            else{
                strFirstItemText = g_objIntellisenseElement.childNodes.item( 0 ).innerText;
                strTypedText = g_objIntellisenseParent.innerText;
            }

            if (strFirstItemText.toLowerCase() == strTypedText.toLowerCase()) {
            
                // A known value was typed into the field. Use our own casing (just in cAsE!)
                if (__isFireFox) {
                    g_objIntellisenseParent.textContent = strFirstItemText;
                }
                else {
                    g_objIntellisenseParent.innerText = strFirstItemText;
                }

                // Set the value of the existing choice in the hidden field - so we can access it on post back
                document.getElementById(g_objIntellisenseParent.getAttribute("HiddenValue")).setAttribute( "value", strFirstItemText );

                var strDataID = g_objIntellisenseElement.childNodes.item(0).getAttribute("dataid");
                document.getElementById(g_objIntellisenseParent.getAttribute("HiddenValueId")).setAttribute("value", strDataID);

                g_objIntellisenseParent.style.backgroundColor = "#CC99CC";
                g_objIntellisenseParent.setAttribute("validate", "true");
            }
        }

        RemoveIntellisenseMenu();
    }
}

function SetActiveIntellisenseMenuItem( nIndex, bScrollToTop, bDontScroll ) {

    var objMenu = g_objIntellisenseElement;
    if ( objMenu != null && objMenu.childNodes != null )
    {
        if ( nIndex >= objMenu.childNodes.length )
        {
            // Reached the end of the menu
            g_nActiveMenuItem = objMenu.childNodes.length - 1;
            return;
        }
        else if ( nIndex < 0 )
        {
            g_nActiveMenuItem = 0;
            return;
        }

        for (var i = 0; i < objMenu.childNodes.length; i++) {

            if ( i == nIndex )
            {
                objMenu.childNodes.item(i).className = "intellisense_menuitem_active";
                
                if ( !bDontScroll && objMenu.clientHeight >= 350 )
                {
                    objMenu.childNodes.item( i ).scrollIntoView( bScrollToTop ? true : false );
                }
            }
            else
            {
                objMenu.childNodes.item(i).className = "intellisense_menuitem";
            }
        }   
        
        g_nActiveMenuItem = nIndex;
    }
}

function DropDownIMenu( strControlID )
{
    g_objIntellisenseParent = document.getElementById(strControlID);
    ShowIntellisenseMenu();
    g_objIntellisenseParent.focus();
    
}

function ShowIntellisenseMenu() {

    if (g_objIntellisenseElement) {
        return;
    }

    var strTypedValue = (__isFireFox ? g_objIntellisenseParent.textContent.toLowerCase() : g_objIntellisenseParent.innerText.toLowerCase());

    // Get the values dependent of configurated value array (attribute on label control)

    var objValues = g_objIntellisenseLists[g_objIntellisenseParent.getAttribute("valuearray")];
    var objArray = new Array();

    for ( var i = 1; i < objValues.length; i = i + 2 )
    {
        if ( objValues[i].toLowerCase().substring(0, strTypedValue.length) == strTypedValue) // Nomally only matching values are shown
        {
            objArray[ objArray.length ] = objValues[ i - 1 ]
            objArray[ objArray.length ] = objValues[ i ]
        }
    }

    if ( objArray.length == 0 )
    {
        // No items to show
        if (g_objIntellisenseParent.getAttribute("OnlyAllowListValues") == "True" ) {
            // If no values matches the typed in value, then show the full monty
            // When we only allow list values, we go an
            // extra mile to tempt the user to select from the list
            for (var i = 1; i < objValues.length; i = i + 2) {
                objArray[objArray.length] = objValues[i - 1]
                objArray[objArray.length] = objValues[i]
            }

            g_objIntellisenseParent.style.backgroundColor = "#ff6666";
            g_objIntellisenseParent.setAttribute("validate", "false");
        }
        else {
            return false;
        }
    }
    else {
        g_objIntellisenseParent.style.backgroundColor = "#CC99CC";
        g_objIntellisenseParent.setAttribute("validate", "true");
    }

    var objPos = GetElementAbsolutePos(g_objIntellisenseParent, "content");

    //if (__isFireFox) objPos.y += 105;

    g_objIntellisenseElement = document.createElement( "div" );
    g_objIntellisenseElement.style.position = "absolute";
    g_objIntellisenseElement.style.width = g_objIntellisenseParent.clientWidth + "px";
        g_objIntellisenseElement.style.top = (objPos.y + g_objIntellisenseParent.clientHeight + 3) + "px";
    g_objIntellisenseElement.style.left = objPos.x + "px";
    g_objIntellisenseElement.onclick = OnIMenuClick;
    
    g_objIntellisenseParent.parentNode.insertBefore(g_objIntellisenseElement, g_objIntellisenseParent);
    g_objIntellisenseElement.setAttribute( "id", "activeintellisensemenu" );
    
    for ( var i = 1; i < objArray.length; i = i + 2 )
    {
        var objItem = document.createElement("div");
        objItem.className = "intellisense_menuitem";
        objItem.setAttribute("dataid", objArray[i - 1]);
        if (__isFireFox) {
            objItem.textContent = objArray[i]; 
        }
        else
        {
            objItem.innerText = objArray[ i ];
        }
        objItem.onmousedown = OnIMenuItemClick;
        objItem.onmouseover = OnIMenuItemMouseOver;
        objItem.onmouseout = OnIMenuItemMouseLeave;
        g_objIntellisenseElement.appendChild( objItem );
    }

    // Set the height for the menu
    g_objIntellisenseElement.style.height = "" + Math.min( 350, parseInt( g_objIntellisenseElement.clientHeight ) ) + "px";
   
    g_nActiveMenuItem = -1;
    return true;
}

function OnIMenuItemMouseOver(e) {
    var objTarget = getEventTarget(e);
    if (objTarget.className == "intellisense_menuitem" ) {
        objTarget.className = "intellisense_menuitem_hover";
    }
}

function OnIMenuItemMouseLeave(e) {
    var objTarget = getEventTarget(e);
    if (objTarget.className == "intellisense_menuitem_hover") {
        objTarget.className = "intellisense_menuitem";
    }
}

function OnIMenuClick(e) {
    e = !e ? window.event : e;
    e.cancelBubble = true;
}

function OnIMenuItemClick(e)
{
    if (__isFireFox) e.cancelBubble = true;
    if (!__isFireFox) event.cancelBubble = true;
    
    var objItem = getEventTarget(e);
    if ( objItem && objItem.className.indexOf( "intellisense_menuitem" ) == 0 )
    {
        var strText = objItem.innerText;
        var c = -1;
        while ( objItem )
        {
            objItem = objItem.previousSibling;
            c++;
        }
        SetActiveIntellisenseMenuItem( c, null, true );
        SelectActiveIMenuItem();
        g_objIntellisenseParent.focus();
    }
}

function RemoveIntellisenseMenu()
{
    // Remove the intellisense menu if there...
    if ( g_objIntellisenseElement ) {
        g_objIntellisenseElement.parentNode.removeChild( g_objIntellisenseElement );
        g_objIntellisenseElement = null;
        g_nActiveMenuItem = -1;
    }
}

