﻿var EntryPickerRelation = '';
var LastEntryPickerRelation = '';

function OnEntryPickerKeyDown(event, id)
{
    var cmb = GetCombo(id);
    if (event.keyCode == 13 // Enter
        )
    {

        if (!document.all)
            event.preventDefault();

        OnEntryPickerScroll(id);
        return false;
    }

    if (event.keyCode == 9 // Tab
        || event.keyCode == 27 // Esc
        )
    {
        FocusNext($(id + '_search'));
        OnEntryPickerClose(id);
        
    }

    return true;
}
function OnEntryPickerKeyUp(event, id)
{
    var cmb = GetCombo(id);
    if (cmb.CloseTimeout)
        clearTimeout(cmb.CloseTimeout);

    var h = GetHeight($(id + '_results'));
    
    switch (event.keyCode)
    {
        case 112: // f1
        case 113: // f2
        case 114: // f3
        case 115: // f4
        case 116: // f5
        case 117: // f6
        case 118: // f7
        case 119: // f8
        case 120: // f9
        case 121: // f10
        case 122: // f11
        case 123: // f12
        case 27: // Esc
            return false;
        case 39: // Right
        case 37: // Left
        case 35: // End
        case 36: // Home
        case 33: // Page Up
        case 34: // Page Down
        case 144: // Numlock
        case 16: // Shift
        case 17: // Ctrl
        case 18: // Alt
        case 91: // Windows
        case 93: // Menu
        case 20: // capslock
        case 9: // tab
            
            return true;
        case 13: // Enter
            //case 10:
            if (!document.all)
                event.preventDefault();

            //OnEntryPickerScroll(id );
            cmb.UnselectAll();
            if (cmb.SelectedIndex >= cmb.RecordCount)
                cmb.SelectedIndex = cmb.RecordCount;

            OnEntryPickerSelect(id, cmb.SelectedIndex, true);
            OnEntryPickerClose(id);

           
            return false;
        case 40: // Down
            if (!document.all)
                event.preventDefault();
            //if (!cmb.TypedText)
            //    cmb.TypedText = $(id+'_text').value;
            cmb.UnselectAll();
            cmb.SelectedIndex++;
            if (cmb.SelectedIndex >= cmb.RecordCount)
                cmb.SelectedIndex = cmb.RecordCount;

            if (cmb.SelectedIndex < cmb.FirstVisibleRowIndex)
                cmb.FirstVisibleRowIndex = cmb.SelectedIndex;
            else if (cmb.SelectedIndex > cmb.FirstVisibleRowIndex + cmb.VisibleRows(h))
                cmb.FirstVisibleRowIndex = cmb.SelectedIndex;


            $(id + '_layer').scrollTop = cmb.FirstVisibleRowIndex * parseInt(cmb.ComboItemHeight);
            OnEntryPickerSelect(id, cmb.SelectedIndex, false);
            if ($(id + '_layer').style.display != 'block')
                OnEntryPickerOpen(id);
            //    setTimeout("DelayScrollFetch('"+id+"')", 100);
            return false;
        case 38: // Up
            if (!document.all)
                event.preventDefault();
            //if (!cmb.TypedText)
            //    cmb.TypedText = $(id+'_text').value;
            cmb.UnselectAll();
            cmb.SelectedIndex--;
            if (cmb.SelectedIndex < 0)
                cmb.SelectedIndex = 0;
            else if (cmb.SelectedIndex < cmb.FirstVisibleRowIndex + 2)
                cmb.FirstVisibleRowIndex = cmb.SelectedIndex - (cmb.VisibleRows(h) - 2);
            if (cmb.FirstVisibleRowIndex < 0)
                cmb.FirstVisibleRowIndex = 0;
            OnEntryPickerSelect(id, cmb.SelectedIndex, false);
            $(id + '_layer').scrollTop = cmb.FirstVisibleRowIndex * parseInt(cmb.ComboItemHeight);
            if ($(id + '_layer').style.display != 'block')
                OpenComboLayer(id);
            //            if ($(id+'_layer').style.display != 'block'
            //                || !$(id+'_i'+cmb.FirstVisibleRowIndex.toString()+'t'))
            //                setTimeout("DelayScrollFetch('"+id+"')", 100);
            return false;
    }

    //OnComboClearValue(id);
    $(id + '_text').innerHTML = '';
    $(id + '_value').value = '';
    
    cmb.SelectedIndex = -1;

    if (cmb.ScrollTimeout)
        clearTimeout(cmb.ScrollTimeout);


    cmb.TypedText = $(id + '_search').value;

    if ($(id + '_results').scrollTop != 0)
        $(id + '_results').scrollTop = 0;

    //OnComboSelect(id, cmb.SelectedIndex, false);
    cmb.ScrollTimeout = setTimeout("OnEntryPickerScroll('" + id + "')", 1000);
    return true;
}
function OnEntryPickerMouseUp(event, id)
{

}
function OnEntryPickerMouseOut(event, id)
{
    var cmb = GetCombo(id);
    if (cmb)
        cmb.HasCursorExited = true;
}

function OnEntryPickerDelayClose(event, id)
{
    var cmb = GetCombo(id);
    if (cmb.CloseTimeout)
        clearTimeout(cmb.CloseTimeout);
    cmb.CloseTimeout = setTimeout("OnEntryPickerClose('" + id + "')", 1500);
}

function OnEntryPickerDelayCloseCancel(event, id)
{
    var cmb = GetCombo(id);
    if (cmb.CloseTimeout)
        clearTimeout(cmb.CloseTimeout);
}
function OnEntryPickerClose(id)
{
    var cmb = GetCombo(id);
   // if (!cmb.HasCursorExited)
   //     return;
    cmb.HasCursorExited = true;
    
    if ($(id + '_results'))
        cmb.LastScrollTop = $(id + '_results').scrollTop;

    var div = $(id + '_layer');
    if (div)
        div.style.display = 'none';
    if (cmb.ScrollTimeout)
        clearTimeout(cmb.ScrollTimeout);
}
function OnEntryPickerScroll(id)
{
    var cmb = GetCombo(id);
    cmb.HasCursorExited = false;

    if (cmb.IsRendering || cmb.IsSettingScrollTop)
        return;
    if (cmb.ScrollTimeout)
        clearTimeout(cmb.ScrollTimeout);
    if (cmb.CloseTimeout)
        clearTimeout(cmb.CloseTimeout);


    var div = $(id + '_results');
    cmb.FirstVisibleRowIndex = parseInt(div.scrollTop / parseInt(cmb.ComboItemHeight));
    cmb.ScrollTimeout = setTimeout("OnEntryPickerScrollFetch('" + id + "')", 200);
    
}
function OnEntryPickerScrollFetch(id)
{
    var cmb = GetCombo(id);
    cmb.HasCursorExited = false;
    clearTimeout(cmb.ScrollTimeout);

    var div = $(id + '_layer');

    if (div.style.display == 'block')
    {
        var h = GetHeight($(id + '_results'));
        GlobalCB('EntryPicker.OnCallback', id, 'scroll',
            cmb.FirstVisibleRowIndex.toString(),
            cmb.VisibleRows(h),
            cmb.TypedText,
            cmb.HideCompleted ? "1" : "0",
            cmb.Filter,
            cmb.Sort,
            cmb.SortDir, 
            EntryPickerRelation+' ');
    }
    else
    {
        OnEntryPickerOpen(id);
    }
}
function OnEntryPickerFilterCompleted(id, val) {
    var cmb = GetCombo(id);
    cmb.HasCursorExited = false;
    cmb.HideCompleted = val=="1";
    OnEntryPickerScrollFetch(id);
}
function OnEntryPickerFilter(id, filter)
{
    var cmb = GetCombo(id);
    cmb.HasCursorExited = false;
    cmb.Filter = filter;
    OnEntryPickerScrollFetch(id);
}
function OnEntryPickerSort(id, sort)
{
    var cmb = GetCombo(id);
    cmb.HasCursorExited = false;
    if (cmb.Sort == sort)
        cmb.SortDir = cmb.SortDir=='Asc'?'Desc':'Asc';
    cmb.Sort = sort;
    
    OnEntryPickerScrollFetch(id);
}
function OnEntryPickerOpen(id)
{
    setTimeout("OnEntryPickerOpenDelayed('" + id + "')", 50);
}

function OnEntryPickerOpenDelayed(id) {

    var cmb = GetCombo(id);
    if (!cmb.Filter)
        cmb.Filter =  $(id + '_preFilter').value;
    if (!cmb.Sort)
        cmb.Sort = 'EntryID';
    if (!cmb.SortDir)
        cmb.SortDir = 'Desc';
        
        
    cmb.IsRendering = true;

    var div = $(id + '_layer');

  
    
    div.style.width = '475px';
    //div.style.overflow = 'auto';
    //div.style.overflowX = 'hidden';
    div.style.zIndex = 100;
    div.style.backgroundColor = '#ffffff';
    div.style.border = '1px solid #7F9DB9'; //#555555
    div.style.position = 'absolute';
    
    //div.style.paddingTop = '79px';
    div.style.marginTop = '-27px';
    div.style.marginLeft = '-5px';
  
    //$(id + '_sizeDummy').style.display = 'block';
    //cmb.ComboItemHeight = GetHeight($(id + '_sizeDummy'));
    //$(id + '_sizeDummy').style.display = 'none';
    if (!cmb.ComboItemHeight)
        cmb.ComboItemHeight = 20;
    div.style.height = '200px';
    if (isNaN(cmb.FirstVisibleRowIndex))
        cmb.FirstVisibleRowIndex = 0;

    div.style.display = 'block';
    if ($(id + '_search')
        && LastEntryPickerRelation == EntryPickerRelation)
    {
        // div.style.display = 'block';
        cmb.IsRendering = false;
        $(id + '_search').value = $(id + '_text').innerHTML;
        if ($(id + '_search').value == '&nbsp;')
            $(id + '_search').value = '';
        cmb.TypedText = '';
        $(id + '_search').focus();

        if (cmb.LastScrollTop)
            $(id + '_results').scrollTop = cmb.LastScrollTop;
        // OnEntryPickerScrollFetch(id);
        return;
    }
    
    //$(id + '_loading').style.display = 'block';
    if (!cmb.TypedText)
        cmb.TypedText = $(id + '_text').innerHTML;

    if (!EntryPickerRelation
        && $(id + '_related').value)
        EntryPickerRelation = $(id + '_related').value;

    GlobalCB('EntryPicker.OnCallback', id, 'build',
            cmb.FirstVisibleRowIndex.toString(),
            cmb.VisibleRows(10/*initial*/),
            cmb.TypedText,
            cmb.HideCompleted ? "1" : "0",
            cmb.Filter,
            cmb.Sort,
            cmb.SortDir, 
            EntryPickerRelation + ' ');

}

function OnEntryPickerData(id, data)
{
    var cmb = GetCombo(id);
    cmb.RecordCount = data.RecordCount;
    cmb.ComboItemHeight = 26;
    var s = '';
    var start = data.RangeStart; // zero based index
    var end = start + data.RangeLength-1;

    var styleOff = 2; //4

    s += "<table class=\"ColouredTable\" cellspacing=0>";
    
    if (start != 0)
    {
        s += "<tr><td colspan='4' style='height: " + (((cmb.ComboItemHeight) * (start))) + "px; cursor: wait;' ";
        s += ">&nbsp;</td></tr>";
    }

    
    for (var i = 0; i < data.Items.length && i <= data.RangeLength; i++)
    {

        var idx = start + i;

        var clickCmd = " onclick=\"OnEntryPickerSelect('" + id + "', '" + idx + "', true); OnEntryPickerClose('" + id + "');\"";
        
        
        s += "<tr id=\"" + id + "_i" + idx + "\"";
        s += " class=\"ComboBoxItem\"";
        if (data.Items[i].ParentName)
            s += " title=\"" + data.Items[i].ParentName + "\"";
        s += ">";
        s += "<td style=\"width: 45px;\" " + clickCmd + ">";
        s += data.Items[i].Type;
        s += "<input type=\"hidden\" id=\"" + id + "_i" + idx + "t\" value=\"" + HtmlEncode(data.Items[i].Name) + "\"/>";
        s += "<input type=\"hidden\" id=\"" + id + "_i" + idx + "v\" value=\"" + data.Items[i].EntryID + "\"/>";
        s += "<input type=\"hidden\" id=\"" + id + "_pki" + data.Items[i].EntryID + "\" value=\"" + idx + "\"/>";
        s += "</td>";
        s += "<td " + clickCmd + "><div style=\"overflow: hidden; white-space: nowrap; width: 190px;\">" + data.Items[i].Name + "</div></td>";
        s += "<td><div style=\"overflow: hidden; white-space: nowrap; width: 150px;\">";
        if (data.Items[i].EntityID)
            s += "<a href=\"javascript:;\" onmouseup=\"OnEntryPickerSetRelation('" + id + "','" + data.Items[i].EntityID + "');\">";
        s += data.Items[i].Client;
        if (data.Items[i].EntityID) 
            s += "</a>";
        s += "</div></td>";
        s += "<td " + clickCmd + " style=\"width: 25px;\">" + data.Items[i].EntryID + "</td>";
        s += "</tr>";
    }
   
    
    //if (end < cmb.RecordCount)
    if ((cmb.RecordCount - end) > 0)
    {
        s += "<tr><td colspan='4' style='height: " + ((cmb.ComboItemHeight) * ((cmb.RecordCount - end))) + "px; cursor: wait;' ";
        s += ">&nbsp;</td></tr>";
    }

    s += "</table>";

   
    var div = $(id + '_layerInner');
    div.innerHTML = s;

    var val = $(id + '_value').value;

    if (val
        && $(id + '_pki' + val))
        $(id + '_i' + $(id + '_pki' + val).value).className = 'ComboBoxItemSelected';


//    if (cmb.RecordCount * cmb.ComboItemHeight < ComboDropDownHeight)
//    {
//        $(id + '_layer').style.height = (cmb.RecordCount * (cmb.ComboItemHeight + 2)) + 'px';

//    }
//    else
//    {
//        $(id + '_layer').style.height = ComboDropDownHeight + 'px';
//    }

    $(id + '_loading').style.display = 'none';
    if (cmb.RecordCount == 0)
    {
        //$(id+'_layer').style.display = 'none';
        $(id + '_loading').style.display = 'block';
        $(id + '_loading').innerHTML = 'No Results.';
        $(id + '_loading').style.display = 'block';
        $(id + '_loading').style.width = $(id + '_layer').style.width;
        $(id + '_loading').className = 'Tiny';
        $(id + '_loading').style.textAlign = 'center';
        $(id + '_loading').style.color = '#cccccc';
    }
    cmb.IsRendering = false;
}
function OnEntryPickerSetRelation(id, EntityID)
{
    var cmb = GetCombo(id);
    if (!cmb)
        return;
    cmb.HasCursorExited = false;
    cmb.FirstVisibleRowIndex = 0;
    EntryPickerRelation = EntityID;
    if ($(id + '_results')
        && $(id + '_results').scrollTop != 0)
    {
        $(id + '_results').scrollTop = 0;
    }
    if ($(id + '_layer')
        && $(id + '_layer').style.display == 'block')
        OnEntryPickerScrollFetch(id)
}
function OnEntryPickerSelect(id, index, overwrite)
{
    var cmb = GetCombo(id);

    cmb.SelectedIndex = parseInt(index);
    if ((!$(id + '_i' + index + 't') || !$(id + '_i' + index.toString() + 't'))
        && !cmb.IsSelectionRequired)
    {
        cmb.IsSelectionRequired = true;
        var div = $(id + '_results');
        div.scrollTop = (cmb.SelectedIndex - 1) * cmb.ComboItemHeight;

        setTimeout("OnEntryPickerScroll('"+id+"')", 100);
        return;
    }

    if (!$(id + '_i' + index.toString() + 't'))
        return;

    
    if (overwrite)
    {
        cmb.TypedText = '';
        $(id + '_text').innerHTML = $(id + '_i' + index.toString() + 't').value;
        $(id + '_value').value = $(id + '_i' + index.toString() + 'v').value;
    }
    else
    {
        //cmb.SetTextBoxAutoComplete($(id + '_i' + index.toString() + 't').value);
        //$(id + '_value').value = $(id + '_i' + index.toString() + 'v').value;
    }
    // window.status = 'value set';
    var onselectscript = $(id + '_onchange').value;
    if (onselectscript)
        eval(onselectscript);

    // Unselect others
    for (var i = cmb.SelectedIndex - 10; i < cmb.SelectedIndex + 10; i++)
    {
        if (i < 0 || !$(cmb.ID + '_i' + i))
            continue;
        $(cmb.ID + '_i' + i).className = 'ComboBoxItem';
    }
    if ($(cmb.ID + '_i' + cmb.SelectedIndex))
        $(cmb.ID + '_i' + cmb.SelectedIndex).className = 'ComboBoxItemSelected';

    //FocusNext($(cmb.ID + '_value'));
}