/* CONSTANTES CORRESPONDANTS AUX DIFFERENTS MODES D’UTILISATION DU CONTEXTE */
var CONTEXT_MODE_RAYONS = 'mode_1_0';
var CONTEXT_MODE_RAYON = 'mode_1_1';
var CONTEXT_MODE_FAMILLES = 'mode_2_0';
var CONTEXT_MODE_FAMILLE = 'mode_2_1';
var CONTEXT_MODE_MODELES = 'mode_3_0';
var CONTEXT_MODE_MODELE = 'mode_3_1';
var CONTEXT_MODE_SWITCH = 'mode_4_0';

/* CONSTANTE POUR LES DIFFERENTS FILTRES */
var ACT_FILTRE_PRIX = SERVICE_CONSTANTS.DATA_FILTER_PRICE ; //FILTRE SUR LES PRIX
var ACT_FILTRE_ASS = SERVICE_CONSTANTS. DATA_FILTER_MIX ; //FILTRE SUR LES ASSORTIMENTS

/* CONSTANTE POUR LES DIFFERENTS FILTRES */
var STEP_1 = SERVICE_CONSTANTS.STEP_1 ; //FILTRE SUR LES ETAPES DE VIE 1
var STEP_2 = SERVICE_CONSTANTS.STEP_2 ; //FILTRE SUR LES ETAPES DE VIE 2
var STEP_3 = SERVICE_CONSTANTS.STEP_3 ; //FILTRE SUR LES ETAPES DE VIE 3
var STEP_HTN = SERVICE_CONSTANTS.STEP_MIXTE ; //FILTRE SUR LES ETAPES DE VIE MIXTE


/** ******************************************************************************
* Permet de creer l' objet context : JoServiceContext
* params :
*    _rootServer : l'url d'acces a erep. Par ex. http://www.domyos-limited.com/erep1/
*    _lang : le code langue. Par ex. FR
*    _site : l'identifiant du site. Par ex. 35980534
*    _central : l'identifiant de la centrale. Par ex. 1 
*    _typeService : le type du service appele
*    _localfunc : la fonction de post traitement ajax
*/
function getServiceContext(_rootServer, _lang, _site, _central){
    var oContext = new JoServiceContext(_rootServer, _lang, _site, _central, null) ;
    
    return oContext ;
}


/** ******************************************************************************
* Permet de definir le mode lu contexte de service
* params :
*    _oContext : l'objet JoServiceContext
*    _modeContext : Le mode du context CONTEXT_MODE_RAYONS | CONTEXT_MODE_RAYON | CONTEXT_MODE_FAMILLES | CONTEXT_MODE_FAMILLE | CONTEXT_MODE_MODELES | CONTEXT_MODE_MODELE
*    _arg3 : non obligatoire. Correspond a l'identifiant R3 du rayon ou de la famille ou du code modele ou a une liste de modele 
*    _kind : THIRD_KIND_SITE
*    _siteId : Id du site
*/
function setModeContext(_oContext, _modeContext, _arg3, _siteId){
    //MODE RAYONS
    if(_modeContext == CONTEXT_MODE_RAYONS){
        _oContext.setDepartments();
    }
    //MODE RAYON
    //_arg3 doit etre l'identifiant R3 du rayon
    else if(_modeContext == CONTEXT_MODE_RAYON){
        _oContext.setDepartment(_arg3);
    }
    //MODE FAMILLES
    //_arg3 doit etre l'identifiant R3 du rayon    
    else if(_modeContext == CONTEXT_MODE_FAMILLES){
        _oContext.setFamilies(_arg3);
    }
    //MODE FAMILLE
    //_arg3 doit etre l'identifiant R3 de la famille    
    else if(_modeContext == CONTEXT_MODE_FAMILLE){
        _oContext.setFamily(_arg3);
    }
    //MODE MODELES
    //_arg3 doit etre la liste des codes modeles    
    else if(_modeContext == CONTEXT_MODE_MODELES){
        _oContext.setModels();
        for(var i=0 ; i<_arg3.length() ; i++){
            var model = _arg3.get(i) ;
            
            /* Integration des codes modeles dans le service */
            _oContext.addModels(model);
        }
    }
    //MODE MODELE
    //_arg3 doit etre le code modele       
    else if(_modeContext == CONTEXT_MODE_MODELE){
        _oContext.setModel(_arg3);
    }
    //MODE SWITCH
    else if(_modeContext == CONTEXT_MODE_SWITCH){
        _oContext.setSwitches(THIRD_KIND_SITE, _siteId, _siteId, null, null, null);
    }    
}


/** ******************************************************************************
* Permet d'activer un filtre sur le contexte de service
* params :
*    _oContext : l'objet JoServiceContext
*    _isActive : true | false : activation ou non de la gestion des filtres
*    _typeFiltre : Type de filtre a activer :  ACT_FILTRE_PRIX | ACT_FILTRE_ASS
*/
function activateDataFilter(_oContext, _isActive, _typeFiltre){
    //Activation ou non de la gestion des filtres
    if(_isActive){
        _oContext.activateDataFilter();
    }
    else{
        _oContext.desactivateDataFilter();
    }
    
    //Activation ou non du filtre selectionne
    if(_typeFiltre){
       if(_isActive){
            _oContext.enableDataFilter(_typeFiltre);
        }
        else{
            _oContext.disableDataFilter(_typeFiltre);
        }
    }
}


/** ******************************************************************************
* Permet d'activer un filtre sur le contexte de service
* params :
*    _oContext : l'objet JoServiceContext
*    _isActive : true | false : filtre ou non sur cet etape
*    _stepToEnable : L'etape a filtrer :  STEP_1 | STEP_2 | STEP_3
*    _isHeterogen : true | false : donnees heterogenes ou non
*/
function enableStepFilter(_oContext, _isActive, _stepToEnable, _isHeterogen){
    //Activation ou non de la gestion des filtres sur les etapes
    if(_isActive){
        _oContext.enableStepFilter(_stepToEnable); //on ne va recuperer que les produits ayant cette etape
    }
    else{
        _oContext.disableStepFilter(_stepToEnable) ; //on va recuperer tous les produits n'ayant pas cette etape
    }
    
    //Recuperation ou non des modeles heterogenes
    if(_isHeterogen){
        _oContext.enableStepFilter(STEP_HTN);
    }
    else{
        _oContext.disableStepFilter(STEP_HTN);
    }
}


/** ******************************************************************************
* Permet l'execution du contexte de service
* params :
*    _oContext : l'objet JoServiceContext
*    _postExecuteServiceFunc : la fonction post ajax a appeler
* return :
*    the service id
*/
function executeService(_oContext, _postExecuteServiceFunc) {
   /* CREATION D UN NOUVEAU DE SERVICE. */
   var joService = new JoService(_oContext);
    
   /* EXECUTION DU SERVICE. */
   joService.execute(_postExecuteServiceFunc);

   return joService.getId() ;
}


/** ******************************************************************************
* Permet de charger et d'executer un service
* params :
*    _urlErep : l'url erep root serveur
*    _language : le code langage
*    _idSite : l'id du site
*    _idCentral : l'id de la centrale
*    _contextMode : l'id du service exectue
*    _idContextModel : l'id pour le mode du contexte. Par exemple, l'id du rayon, l'id de la famille, l'id du modele
*    _localfunc : l'id du service exectue
*    isActivePriceFilter : doit on activer le filtre sur les prix
*    isActiveAssortFilter : doit on activer le filtre sur les assortiments
* returns :
*    l'identifiant du service
*/
function initExecuteService(_urlErep, _language, _idSite, _idCentral, _contextMode, _idContextModel, _localfunc, isActivePriceFilter, isActiveAssortFilter) {
    var oContext = getServiceContext(_urlErep, _language, _idSite, _idCentral) ; //CREATION DU CONTEXT
    setModeContext(oContext, _contextMode, _idContextModel, _idSite) ; //DEFINITION DU MODE DE CONTEXTE

    if(isActivePriceFilter){
        activateDataFilter(oContext, true, ACT_FILTRE_PRIX); //FILTRE SUR LES PRIX
    }
    
    if(isActiveAssortFilter){
        activateDataFilter(oContext, true, ACT_FILTRE_ASS); //FILTRE SUR LES ASSORTIMENTS
    }
    
    //Execution du context
    return executeService(oContext, _localfunc) ;
}


/** ******************************************************************************
* Permet de recuperer l'objet Item
* params :
*    _idService : l'id du service exectue
*    _idItem : l'id de l'item
*/
function getMyItem(_idService, _idItem) {
   /* RECUPERATION DU CONTEXTE DE SERVICE. */
   var oService = getService(_idService) ;
   
   /* RECUPERATION DU CONTENU DU SERVICE */
   var oContent = oService.getContent();
   
   /* RECUPERATION DE L'ITEM. */
   if (oContent != null) {
       return oContent.getItem(_idItem);
   }
   else{
       return null;
   }
}


/** ******************************************************************************
* Permet de recuperer l'objet Switch
* params :
*    _idService : l'id du service exectue
*    _idItem : l'id de l'item
*/
function getMySwitch(_idService, _switchName, _thirdKind, _siteNumber, _lang) {
   /* RECUPERATION DU CONTEXTE DE SERVICE. */
   var oService = getService(_idService) ;
   
   /* RECUPERATION DU CONTENU DU SERVICE */
   var oContent = oService.getContent();
   
   /* RECUPERATION DE L'ITEM. */
   if (oContent != null) {
       var switches = oContent.getSwitches() ;
       return switches.getSwitch(_switchName, _thirdKind, _siteNumber, _siteNumber, _lang) ;
   }
   else{
       return null;
   }
}


/** ******************************************************************************
* Permet de recuperer une liste d'objet Switch
* params :
*    _idService : l'id du service exectue
*/
function getSwitches(_idService) {
    try{
        /* RECUPERATION DU CONTEXTE DE SERVICE. */
        var oService = getService(_idService) ;
        
        /* RECUPERATION DU CONTENU DU SERVICE */
        var oContent = oService.getContent();
        
        /* RECUPERATION DE L'ITEM. */
        if (oContent != null) {
           var switchesList = oContent.getSwitchesList() ; 
           return switchesList ;
        }
        else{
           return null;
        }
   }
   catch (e) {
       return null ;
   }        
}


/** ******************************************************************************
* Permet de recuperer le nombre d'item
* params :
*    _idService : l'id du service exectue
*/
function getNbItem(_idService) {
    try {
       /* RECUPERATION DU CONTEXTE DE SERVICE. */
       var oService = getService(_idService) ;
       
       /* RECUPERATION DU CONTENU DU SERVICE */
       var oContent = oService.getContent()
       
       /* RECUPERATION DE L'ITEM. */
       if (oContent != null) {
           var oItems = oContent.getItems(); 
           if(oItems){
               return oItems.getSize() ;
           }
           else{
               return -1 ;
           }
       }
       else{
           return -1 ;
       }
   }
   catch (e) {
       return -1 ;
   }
}