/******************************************************************
* Client-Side Event Listener
******************************************************************/
var CONSUME_EVENT = -1;
var NEXT_EVENT_LISTENER = 0;
var NEXT_EVENT_LISTENER_AND_SUBMIT = 1;

/*******************************************************************
 * Lorsqu'un component appel "onFireComponentAction", le component passe une 
 * valeur par défaut. Cette valeur sert de valeur de retour si aucun listener
 * n'est associé au compoennt.
 * 
 *  ex :
 *      La toolbar dans la définition de son comportement submit le
 *      formulaire html. Donc sa valeur pas défaut est True. Tandis
 *      que le TreeComponent ne doit pas submité le formulaire html.
 *      Tout sa mécanique se passe en javascript. Donc sa valeur par
 *      défaut est False.
 *      
 *  Donc dans le cas ou aucun listener n'est associé à un component. La
 *  valeur par défaut est retourné.
 *      
 *  Si un ou plusieurs listener est associé à un component, voici le
 *  comportement:
 *  
 *      Si un listener parmis les listeners associé retourne 
 *      NEXT_EVENT_LISTENER_AND_SUBMIT le component soumettra le formulaire.
 *      
 *      Si tou les listener retourne NEXT_EVENT_LISTENER, le component ne 
 *      soumettra pas le formulaire.
 *      
 *      Si un listener retourne CONSUME_EVENT, il arret l'execution des listeners
 *      et le formulaire n'est pas soumit. Cette valeur de retour est souvent utilisé
 *      lorsque qu'un listener affiche une fenêtre modal.
 *
 *******************************************************************/

var HIDDEN_COMPONENT_ID = "ComponentID";

var componentList = new Array(0);

/**
 * Return new ComponentObj
 */
function getNewComponentStruct()
{
    var componentObj = new Object();
    componentObj.fullId = null;
    componentObj.listener = new Array(0);
    
    return componentObj;
}

function putComponent(componentObj)
{
    //scharette : (note personnelle) Cette condition ne devrait pas etre la verifier pourquoi le rad ne fonctionne pas sans cette condition.
    // le rad ajoute deux objet ayant le meme id mais a des index different. (voir ancien code).
    if(!componentList[componentObj.fullId])
    {
        componentList[componentObj.fullId] = componentObj;
    }
}

/**
 * get component, componentId is the fullId
 */
function getComponent(componentId)
{
   return componentList[componentId];
}

/////////////////////////////////////////
// Add a listener to the array of listener received, componentId is the fullId
/////////////////////////////////////////
function addComponentListener(componentId, listener)
{
    // get component
    var componentObj = getComponent(componentId);
    
    // if component does'nt exist
    if (!componentObj)
    {
        // create new component
        componentObj = getNewComponentStruct();
        componentObj.fullId = componentId;
    }

    // add listenent a tend of list
    componentObj.listener[componentObj.listener.length] = listener;
    
    // put component in list
    putComponent(componentObj);
}


/////////////////////////////////////////
// launch event at each listeners
// 
// componentID, full id of component where listener is call
//
// defaultReturnValue is the default return value if component haven't javascrpit listener
//
// if the listener return -1 --> event is consumed (the next listeners doesn't receive the event)
// if the listener return 1 --> pass to next listener and the onFireAction will return TRUE (submit)
// if the listener return 0 --> pass to next listener
/////////////////////////////////////////
function onFireComponentAction(componentId, action, values, defaultReturnValue)
{
    var componentObj = getComponent(componentId);

    var retValue = defaultReturnValue;
    
    var submit = 0;

    // if we have a listener
    if (componentObj && componentObj.listener != null && componentObj.listener.length > 0)
    {
        var i = 0;
        
        for (i = 0 ; i < componentObj.listener.length ; i++)
        {
            result = 0;
            eval("result = " + componentObj.listener[i] + "(componentId, action, values);");
            if(result != CONSUME_EVENT)
                submit += result;
            else
            {
                submit = -1;
                i = componentObj.listener.length;
            }
        }

        if (submit > 0)
            retValue = true;
        else if (submit <= 0)
            retValue = false;
    }

    return retValue;
}

/******************************************************************
* End Of Client-Side Event Listener
******************************************************************/