/**********************************************************************************/
/* textfield_autofilter.js                                                        */
/**********************************************************************************/
/* Based on Denes Kubicek's JS example                                            */
/* Modifications par rapport à l'exemple DK:                                      */
/* - No need for TF_SL_SEARCH, TF_SL_TABLE and TF_SL_COLUMN anymore (APEX v3.1)   */
/* - getSearchList => odpGetSearchList                                            */
/* - itemWhere: initial where clause                                              */
/* - function register, new parameter p_Where: initial where clause for the field */
/**********************************************************************************/
/* Modifications                                                                  */
/**********************************************************************************/
/* 14.01.2009 KOR Plus de containers. Les selects sont accrochés au parent des    */
/*                champs texte.  Autrement, il y avait un problème d'affichage    */
/*                des selects au premier plan dans IE (bug zIndex IE)             */
/* 15.01.2009 KOR La position du select est déterminée juste avant l'affichage    */
/*                (au cas où l'écran a été scrollé)                               */
/**********************************************************************************/


var vItem = new Object();
var c_SelectListSize  = 8;

/* KOR 29.12.2008 */
var vSelectListPrefix = "_";
var vSelectListSuffix = "_SELECTLIST";
 
function testReturn(e){
    var keynum;
    if (document.all) { /* IE */
        keynum = e.keyCode;
    } else {
        keynum = e.which;
    }
   alert(keynum);
} 
 
function validateSelection(e){
    var keynum;
    var fieldName;
    keynum = e.keyCode;
    if (document.all) { /* IE */
        keynum = e.keyCode;
    } else {
        keynum = e.which;
    }
    //if (keynum == 9 || keynum ==13) {  
    if ( keynum ==13) {  
        fieldName = e.target.getAttribute("id");
        do_pushBackValue(fieldName);
    }
} 

function getAbsolutePosition(pElement){
    var absPos = new Object();
    var absX = 0;
    var absY = 0;
    
    while (pElement != null) {
       absX += pElement.offsetLeft;
       absY += pElement.offsetTop;
       
       pElement = pElement.offsetParent;
    }
    
    absPos.x = absX;
    absPos.y = absY;
    
    return(absPos);
    
}
 
function register(pTextFieldName, pTableName, pColumnName,pSearchFunction,pWidthCoeff, pMatchColor, pNoMatchColor, pWhere, pCallBack, pSubmitRequest) {

    var elm = html_GetElement(pTextFieldName);
    var obj = getAbsolutePosition(elm);

   
    if (document.all) { /* IE */
        elm.onkeypress = function () {return validateSelection(event);};
        elm.onkeyup    = function () {return showSelectList(event);};
    } else {            /* Other */
        elm.onkeypress = function (e) {return validateSelection(e);};
        elm.onkeyup    = function (e) {return showSelectList(e);};
    }
   
    vItem[pTextFieldName] = {
                              itemTable      : pTableName   
                             ,itemColumn     : pColumnName  
                             ,itemWhere      : pWhere   
                             ,searchFunction : pSearchFunction   
                             ,matchColor     : pMatchColor  
                             ,noMatchColor   : pNoMatchColor
                             ,oldValues      : elm.value
                             ,callBackFunc   : pCallBack
                             ,submitRequest  : (pSubmitRequest? pSubmitRequest.toUpperCase() : false) // Lors de validation, soumettre la page avec ce request, si présent
                             ,absX           : obj.x
                             ,absY           : obj.y + elm.offsetHeight
                             ,elmWidth       : elm.offsetWidth * pWidthCoeff
                             ,widthCoeff     : pWidthCoeff
                            };
}
 
function showSelectList(e) {
/* On arrive ici en premier */
    var keynum;
    var pTextFieldName;
    
    if(document.all)  {	/* IE */
        keynum = e.keyCode
        pTextFieldName = e.srcElement.getAttribute("id");
    } else {			/* Other */
        keynum = e.which
        pTextFieldName = e.target.getAttribute("id");
    }

    if (vItem[pTextFieldName].oldValues != html_GetElement(pTextFieldName).value) {
        vItem[pTextFieldName].oldValues  = html_GetElement(pTextFieldName).value;
        if (html_GetElement(pTextFieldName).value != "") {
            do_showSelectList(pTextFieldName);
        } else {
            removeSelectList(pTextFieldName);
        }
    } else {
        if (keynum == 40 /* down arrow */ || keynum == 38 /* up arrow */) {
            if (!e.shiftKey) {
                if (html_GetElement(vSelectListPrefix+pTextFieldName+vSelectListSuffix)) {
                    html_GetElement(vSelectListPrefix+pTextFieldName+vSelectListSuffix).focus();
                }
            }
        } 

        //if (keynum == 9 || keynum == 13 /* tab or enter !!! Attention !!! Ici, on traite la valeur sélectionnée !!! */ ) {
        if (keynum == 13 /* tab or enter !!! Attention !!! Ici, on traite la valeur sélectionnée !!! */ ) {
            do_pushBackValue(pTextFieldName);
        }
    }
}

function do_showSelectList(pTextFieldName) { 
    var l_Return = null;
    var l_SelectList = html_GetElement(vSelectListPrefix+pTextFieldName+vSelectListSuffix);
    
    if (!l_SelectList) {
		/* Si le drop-down n'existe pas, on le crée */
        l_SelectList = createSelectList(pTextFieldName);
    } else {
		/* Drop-down existe pas. On l'affiche (s'il est caché) */
        l_SelectList.style.visibility="visible";
    }
  
    //var get = new htmldb_Get(null,html_GetElement('pFlowId').value,'APPLICATION_PROCESS=odpGetSearchList',0);
    var get = new htmldb_Get(null,html_GetElement('pFlowId').value,'APPLICATION_PROCESS=' + vItem[pTextFieldName].searchFunction,0);

    get.addParam('x01', html_GetElement(pTextFieldName).value);  
    get.addParam('x02', vItem[pTextFieldName].itemTable      );  
    get.addParam('x03', vItem[pTextFieldName].itemColumn     );  
    get.addParam('x04', vItem[pTextFieldName].itemWhere      );  

    gReturn = get.get('XML');

    if (gReturn && l_SelectList){
        var l_Count = gReturn.getElementsByTagName("row").length;
        l_SelectList.length = 0;
        if (l_Count > 0) {
            if (l_Count < c_SelectListSize) {
              l_SelectList.size = l_Count;
            } else {
              l_SelectList.size = c_SelectListSize;
            }

            for(var i=0;i<l_Count;i++){
                var l_ReturnedItem = gReturn.getElementsByTagName("row")[i];
                appendToSelect(l_SelectList, l_ReturnedItem.firstChild.nodeValue, l_ReturnedItem.firstChild.nodeValue);
                setFieldColor(pTextFieldName, vItem[pTextFieldName].matchColor);
                l_SelectList.options[0].selected=true;
            }
            
            
        } else if (l_Count == 0) {
            removeSelectList(pTextFieldName);
            setFieldColor(pTextFieldName, vItem[pTextFieldName].noMatchColor);
        } 
    }
}

function setFieldColor(pField, pColor) {
    html_GetElement(pField).style.color = pColor;
}

function createSelectList(pTextFieldName) {
    var elm = html_GetElement(pTextFieldName);
    var obj = getAbsolutePosition(elm);
    
    //alert("Original x/y:" + vItem[pTextFieldName].absX + "/" + vItem[pTextFieldName].absY + " *** actual x/y: " + obj.x + "/" + (obj.y + elm.offsetHeight));

    var v_SelectList = document.createElement("select");
    var vElementId   = vSelectListPrefix + pTextFieldName + vSelectListSuffix
    v_SelectList.setAttribute("id", vElementId);
    v_SelectList.style.position = "absolute";
    v_SelectList.style.display  = "block";
    v_SelectList.style.width    = "" + (elm.offsetWidth * vItem[pTextFieldName].widthCoeff);
    v_SelectList.style.left     = "" + obj.x;
    v_SelectList.style.top      = "" + (obj.y + elm.offsetHeight);
    v_SelectList.style.zIndex   = "10";
    v_SelectList.size = c_SelectListSize;
    if (document.all) {
	    /* IE */
        v_SelectList.onclick = function () {return pushBackValue(event);};
        v_SelectList.onkeyup = function () {return pushBackValueReturn(event);};
    } else {
        v_SelectList.onclick = function (e) {return pushBackValue(e);};
        v_SelectList.onkeyup = function (e) {return pushBackValueReturn(e);};
    }

    html_GetElement(pTextFieldName).parentNode.appendChild(v_SelectList);

    return v_SelectList;
 }


function removeSelectList(pTextFieldName) {
     var selectList = html_GetElement(vSelectListPrefix + pTextFieldName + vSelectListSuffix);
    if (selectList.length > 0){
        selectList.style.visibility="hidden";
        selectList.length = 0;
    }    
}
  
function getSelectedValue(pTextFieldName) {
   var ret = html_GetElement(vSelectListPrefix + pTextFieldName + vSelectListSuffix).value;
   
   return (ret == undefined ? null : ret);
}

function do_pushBackValue(pTextFieldName) {
    if (html_GetElement(vSelectListPrefix + pTextFieldName + vSelectListSuffix)){
        /* Nous arrivons ici avec un select ouvert => une sélection vient d'être faite */
        html_GetElement(pTextFieldName).value = html_GetElement(vSelectListPrefix + pTextFieldName + vSelectListSuffix).value;
        setFieldColor(pTextFieldName, vItem[pTextFieldName].matchColor);
        
        /* Remplissons les champs nécessaires, si demandé */
        //vItem[pTextFieldName].callBackFunc();  // Malheureusement, ne traite pas correctement les variables pour les forms multirecord
        eval(vItem[pTextFieldName].callBackFunc);  // Cette astuce marche, par contre
        removeSelectList(pTextFieldName); 

    } else {
        if ($v_IsEmpty(pTextFieldName)){
            eval(vItem[pTextFieldName].callBackFunc);
        } 
    }
    
    if (vItem[pTextFieldName].submitRequest){
       var tmp = vItem[pTextFieldName].submitRequest;
       doSubmit(vItem[pTextFieldName].submitRequest);
    } else {
        html_GetElement(pTextFieldName).focus();
    }  
}

function pushBackValue(e) {
    var pTextFieldName;
    if(document.all)  {
        pTextFieldName = e.srcElement.getAttribute("id");
    } else {
        pTextFieldName = e.target.parentNode.getAttribute("id");
    }

    if (pTextFieldName) {
        do_pushBackValue(pTextFieldName.substring(1, pTextFieldName.indexOf(vSelectListSuffix)));
    }
}

function pushBackValueReturn(e) {
    var keynum;
    var pTextFieldName;
    if(document.all)  {
        keynum = e.keyCode
        pTextFieldName = e.srcElement.getAttribute("id");
    } else {
        keynum = e.which
        pTextFieldName = e.target.getAttribute("id");
    }
    
    //if (keynum == 9 || keynum == 13) {
    if (keynum == 13) {
        do_pushBackValue(pTextFieldName.substring(1, pTextFieldName.indexOf(vSelectListSuffix)));
    }
}

function appendToSelect(pSelect, pValue, pContent) {
    var l_Item = document.createElement("option");
    l_Item.value = pValue;
    if(document.all){
        pSelect.options.add(l_Item);
        l_Item.innerText = pContent;
    } else {
        l_Item.appendChild(document.createTextNode(pContent));
        pSelect.appendChild(l_Item);
    }
}
 

