﻿var constAutoCompletePopupID = '_AutoCompletePopup';
var constAutoCompleteID = '_AutoComplete';
var constAutoCompletePopupTime = 500;
var isAutoCompleteSuppress = false;
var isControlInFocus = false;    
var isAutoCompleteListOpen = false;

String.prototype.trim  = _trim;

function _trim() { return this.replace(/^\s+|\s+$/g, ""); }

function openAutoCompleteList(source, data, e)
{
    var opener = e.srcElement ? e.srcElement : e.target;

    if (opener.id == source.getAttribute('parent'))
    {
    }
    else
    {
        if (!isAutoCompleteListOpen) 
        {
            buildAutoCompleteList(source, data, e, true);
            isAutoCompleteListOpen = true;
            isAutoCompleteSuppress = true;
            source.select();
        }
        else
        {
            hideAutoCompleteList();
        }
        source.focus();
    }    
}

function setAutoCompleteValue(source, data, e)
{    
    var popup = top.document.getElementById(constAutoCompletePopupID);   
    if (!popup) return;
    
    var lastValue = source.value;
       
    data.selectedIndex = popup.firstChild.options[popup.firstChild.selectedIndex].value;        
    
    data.onchange();
    
    source.value = data.options[data.selectedIndex].text;
    
    if (lastValue != source.value)
        source.setAttribute('lastValue',source.value);
        
    source.focus();
}

function setAutoCompleteValueEquals(source, data, e)
{
    var popup = top.document.getElementById(constAutoCompletePopupID);
    var lastValue = source.value;
    var updateCurrentValue = (data) ? true : false;
    
    if (popup)
    {
        if (source.value == popup.firstChild.options[popup.firstChild.selectedIndex].text)
            data.selectedIndex = popup.firstChild.options[popup.firstChild.selectedIndex].value;
                
        if (data.options[data.selectedIndex].value != '-99')
        {
            if (source.value != popup.firstChild.options[popup.firstChild.selectedIndex].text && 
                !isControlInFocus)
                    source.value = data.options[data.selectedIndex].text;
                    
            data.onchange();
            updateCurrentValue = false;
        }
    }
    
    if (updateCurrentValue && 
        source.value != data.options[data.selectedIndex].text)
        source.value = data.options[data.selectedIndex].text;

    if (lastValue != source.value)
        source.setAttribute('lastValue',source.value);
}


function setCurrentAutoCompleteValueEquals()
{
    var popup = getCurrentAutoCompleteListProperties();
    if (!popup) return;
    
    var source = popup[1];
    var data = popup[2];
    
    setAutoCompleteValueEquals(source,data);
}

function closeCurrentAutoCompleteList()
{
    setCurrentAutoCompleteValueEquals();
    deleteAutoCompleteList();    
}

function getCurrentAutoCompleteListProperties()
{
    var popup = top.document.getElementById(constAutoCompletePopupID);
    if (!popup) return;
    
    var frameName = popup.getAttribute("frameName");
    if (!frameName) return [popup];
    
    var parent = popup.getAttribute("parent") ? top.frames[frameName].document.getElementById(popup.getAttribute("parent")) : null;
    if (!parent) return [popup];    
    
    var data = popup.getAttribute("dataObject") ? top.frames[frameName].document.getElementById(popup.getAttribute("dataObject")) : null;
    if (!data) return [popup, parent];
    
    return [popup, parent, data];
}

function hideAutoCompleteList()
{
    var popup = getCurrentAutoCompleteListProperties();
    if (!popup) return;
    
    popup[0].style.display = 'none';
    isAutoCompleteListOpen = false;
}

function deleteAutoCompleteList()
{
    var popup = getCurrentAutoCompleteListProperties();
    if (!popup) return;
        
    popup[0].parentNode.removeChild(popup[0]);
    isAutoCompleteListOpen = false;
}

function deleteAutoCompleteListByTimeout(source, data)
{
    if (!isControlInFocus)
    {
        setAutoCompleteValueEquals(source, data);
        deleteAutoCompleteList();
    }
}

function createAutoCompleteList(oList, obj)
{
    if (top.isLoading)
        return;
        
    deleteAutoCompleteList();
    
    var popup = top.document.createElement('div');
    var table = obj.parentNode.parentNode;
    var elementPosition = top.findPos(table);
    var offsety = 80;
  
    popup.id = constAutoCompletePopupID;
    popup.style.position = "absolute";
    popup.style.zindex = "10000";   
    popup.style.left = elementPosition[0] + 'px';
    popup.style.top = elementPosition[1] + offsety + 'px';
    popup.style.width = table.offsetWidth + 'px';
    top.document.body.appendChild(popup);
    popup.innerHTML = '';
    popup.appendChild(oList);
    popup.style.display = 'block';    
    popup.setAttribute("parent", obj.getAttribute("parent"));
    popup.setAttribute("frameName", obj.getAttribute("frameName"));
    popup.setAttribute("dataObject", obj.getAttribute("dataObject"));    
    isAutoCompleteListOpen = true;
}

function bindControlFocus(source, data, e)
{
    if (top.EnterSuppress != null)
            top.EnterSuppress = true;    

    isControlInFocus = true;
    openAutoCompleteList(source, data, e);
}

function bindControlBlur(source, data, e)
{
    if (top.EnterSuppress != null)
            top.EnterSuppress = false;
          
    isControlInFocus = false;
    
    var popup = top.document.getElementById(constAutoCompletePopupID);
    if (popup && popup.style.display == 'none')
    {       
        setAutoCompleteValueEquals(source, data, e);
    }
    else
    {    
        setTimeout(function() { top.deleteAutoCompleteListByTimeout(source, data); },constAutoCompletePopupTime);
    }
}

function bindAutoCompleteFocus(source, data, e)
{
    isControlInFocus = true;
}

function bindAutoCompleteBlur(source, data, e)
{
    isControlInFocus = false;
    setTimeout(function() { top.deleteAutoCompleteListByTimeout(source, data); },constAutoCompletePopupTime);
}

function bindAutoCompleteClick(source, data, e)
{
    hideAutoCompleteList();
    setAutoCompleteValue(source, data, e);
}

function AutoCompleteSelectDeltaItem(delta)
{
    var popup = top.document.getElementById(constAutoCompletePopupID);
    if (!popup) return;
    
    popup.firstChild.selectedIndex += delta;
}

function bindControlKeydown(source, data, e)
{
    var popup = top.document.getElementById(constAutoCompletePopupID);
    switch (e.keyCode)
    {
        case 40:
          if (popup && popup.firstChild.selectedIndex < popup.firstChild.options.length - 1)
            popup.firstChild.selectedIndex += 1;
          break;
        case 38:
          if (popup && popup.firstChild.selectedIndex > 0)
              popup.firstChild.selectedIndex -= 1;
          break;
        case 13:
        case 9:
            if (popup && popup.style.display != 'none')
                source.value = popup.firstChild.options[popup.firstChild.selectedIndex].text;
            hideAutoCompleteList();
            setAutoCompleteValueEquals(source, data, e);
            break;
        default:
          break;
    }
}

function buildAutoCompleteList(source, data, e, overrideDisplay)
{
    var oList = top.document.createElement('select');
    var selected = -1;
    
    if (!data || !source || e.keyCode == 13)
        return;
        
    var sourceLastText = source.getAttribute("lastValue") ? source.getAttribute("lastValue").toUpperCase().trim() : '';
    var sourceText = source.value.toUpperCase().trim();    
    
    if (sourceText == '' &&  sourceText != sourceLastText) 
        overrideDisplay = true;
    
    if (!overrideDisplay && sourceLastText == sourceText)
        return;

    source.setAttribute('lastValue',source.value);
    
    oList.dir = source.getAttribute("isRightToLeft") ? 'rtl' : 'ltr';
    oList.style.width = '100%';
    oList.style.fontSize = '12px';

    oList.onfocus = function() { top.bindAutoCompleteFocus(source, data, e); };
    oList.onblur = function() { top.bindAutoCompleteBlur(source, data, e); };
    oList.onclick = function() { top.bindAutoCompleteClick(source, data, e); };
    
    for (var i=0; i < data.options.length; i++)
    {
        var text = data.options.item(i).text;
        var value = data.options.item(i).value;
       
        if ((value < 0 && sourceText.length != 0 && !overrideDisplay) || (value == -99)) continue;
        
        var index = text.toUpperCase().indexOf(sourceText);

        if (index>=0 || overrideDisplay)
        {
            if (index == 0 && selected == -1)
                selected = oList.length;
            
            oList.options[oList.length] = new Option(data.options[i].text, i, false, false);
        }
    }
    
    if (oList.length == 0)
    {
        hideAutoCompleteList();
        return;
    }
    
    oList.options[selected != -1 ? selected : 0].selected = true;
    
    oList.size = (oList.length > 10) ? '10' : ((oList.length == 1) ? '2' : oList.length);

    createAutoCompleteList(oList,source);

    if (oList.length == 1 && oList.options[0].text.toUpperCase() == sourceText)
    {
        hideAutoCompleteList();
        
        if (oList.length == 1)
             setAutoCompleteValue(source, data, e);
    }
}

function bindAutoCompleteControl(frameName, srcObjectID, dataObjectID, isRightToLeft)
{
    var source = top.frames[frameName].document.getElementById(srcObjectID);
    var data = top.frames[frameName].document.getElementById(dataObjectID);
    
    if (!source)
        return;
        
    var controlID = constAutoCompleteID + '_' + source.id;
    var control = top.frames[frameName].document.getElementById(controlID);
    
    if (!data)
    {
        source.style.display = 'none';
        return;
    }    
     
    source.onkeydown = function(e) { top.bindControlKeydown(source, data, (e ? e : top.frames[frameName].window.event)); };
    source.onkeyup = function(e) { top.buildAutoCompleteList(source, data, (e ? e : top.frames[frameName].window.event)); };
    source.onfocus = function(e) { top.bindControlFocus(source, data, (e ? e : top.frames[frameName].window.event)); };
    source.onblur = function(e) { top.bindControlBlur(source, data, (e ? e : top.frames[frameName].window.event)); };
    source.onchange = function(e) { top.setAutoCompleteValueEquals(source, data, (e ? e : top.frames[frameName].window.event)); };

    source.setAttribute("parent", source.id);
    source.setAttribute("frameName", frameName);    
    source.setAttribute("dataObject", data.id);    
    source.setAttribute("isRightToLeft", isRightToLeft);    
    
    source.value = data.options[data.selectedIndex].text;
    source.setAttribute('lastValue', source.value);
    
    data.setAttribute("bindTextbox", source.id);
    data.style.display = 'none';
    
    var div;
    if (!control)
    {
        source.parentNode.removeChild(source);
        
        var table = top.frames[frameName].document.createElement("table");    
        table.id = controlID;
        table.cellPadding = '0';
        table.cellSpacing = '0';

        table.style.margin = '0';
        table.style.padding = '0';    
        table.style.borderCollapse = 'collapse';
        
        data.parentNode.appendChild(table);    
       
        var row = table.insertRow(0);
        var columnSource = row.insertCell(0);
        var columnButton = row.insertCell(1);    

        columnSource.appendChild(source);

        var div = top.frames[frameName].document.createElement("div");
        
        div.style.background = 'url(Images/se1.gif) no-repeat center center';
        div.style.border = '1px solid white';
        div.style.width = 15 + 'px';
        div.style.height = 17 + 'px';
        div.onmouseover = function() { this.style.backgroundImage = 'url(Images/se2.gif)'; };
        div.onmouseout = function() { this.style.backgroundImage = 'url(Images/se1.gif)'; };
        columnButton.style.padding = '1px 0px';
        columnButton.appendChild(div);
    }
    else
    {
        div = control.rows[0].cells[1].firstChild;
    }

    div.onclick = function(e) { top.openAutoCompleteList(source, data, (e ? e : top.frames[frameName].window.event)); };
    div.setAttribute("parent", source.id);
    div.setAttribute("frameName", frameName);   
}
