/**
* Prerequis :
* La variable modelList est un objet de type ArrayList et doit oblgatoirement etre initialise dans la page HTML
*/
var _displayPrice = true;
var _displayAssortiment = true;
var nbModelToCheck = 0;
var nbModelHidden = 0;
var possibleAAfficher = new ArrayList();
var isErrorErep = false;
var disableProductList = new ArrayList();
var _urlErep = "" ;
var _isFamilySlideShow = false;

var switchDejaFait=false;
//liste des modeles valides
var enableModelList = new ArrayList();

//Identifiant du service execute
var serviceId = "";

//Map contenant les identifiant de services a partir du service appele
var mapServiceId = new Map();

//############ GESTION DES FILTRES/TRIS ############
//Liste des modeles par prix
var priceModelMap = new Map();

//Pour savoir si on est dans le cas des TG de la HP
var isFromTgHp = false;


/**
* Permet de cacher ou non le bloc produit et d'afficher le picto new
* @param :
*    - httpStatus : le statut HTTP apres l'appel ajax
* @desc :
*    - pour chaque item, on va verfier sa visibilite, si elle est a true alors on affiche le produit, sinon on ne l'affiche pas
*/
var POST_LOAD_ITEM_FAMILY_FUNCTION = function postItemFamilyService(httpStatus) {
	if (httpStatus == "200") {
		var currentServiceId = mapServiceId.get(_SERVICE_ITEM_FAMILY);
		var nbItems = getNbItem(currentServiceId);
		if (nbItems == - 1) {
			isErrorErep = true;
		}
		checkModels(currentServiceId, _displayPrice);
		
		var currentModel = "" ;
		//Fiche produit de type 1
		if (typeof _modeleCourant  == "string"){
			currentModel = _modeleCourant;
		}
		//Fiche produit de type 2
		else if(typeof modeleCourant  == "string") {
			currentModel = modeleCourant;
		}
		
		if(currentModel != ''){
			displayPrevNextProduct(currentModel );
		}
		
		if (typeof nbProduitFamille != "undefined") {
			//generation du bloc pagination
			writePagination(isErrorErep);
			//Affichage des criteres
			if (! isErrorErep) {
				if (typeof activerFiltre != "undefined" && activerFiltre) {
					displayCriteria();
				}
			}
			//Affichage des produits
			show("1");
		}
	} else {
		displayProducts();
	}
}
/**
* Permet de cacher ou non le bloc produit et d'afficher le picto new ou FIN lors du chargement des modeles a partir d'une liste de modele
* @param :
*    - httpStatus : le statut HTTP apres l'appel ajax
* @desc :
*    - pour chaque item, on va verfier sa visibilite, si elle est a true alors on affiche le produit, sinon on ne l'affiche pas
*/
var POST_LOAD_ITEM_MODELS_FUNCTION = function postItemModelsService(httpStatus) {
	if (httpStatus == "200") {
		var currentServiceId = mapServiceId.get(_SERVICE_ITEM_MODELS);
		var nbItems = getNbItem(currentServiceId);
		if (nbItems == - 1) {
			isErrorErep = true;
		}
		checkModels(currentServiceId, _displayPrice);
		
		//Dans le cas des ventes complementaire, doit on cacher ou non le bloc
		hideBlockModels("bloc-decouvrirplus");
		
		if (typeof isVc != "undefined" && isVc) {
			displayBlocVc()
		}
		checkSwitchProductPages(false, modelList);
		
		if (isFromTgHp) {
			displayTgHp();
		}
	}
}


/**
* Permet d'afficher aleatoirement 4 TG sur la homepage
*/
function displayTgHp() {
	var nbTgToDisplay = 3;
	
	var nbTgCanBeDisplayed = enableModelList.length();
	var listeTgToDisplay = new ArrayList();
	var nbTgFound = 0;
	
	while (nbTgFound < nbTgToDisplay) {
		var randomIndex = Math.ceil(Math.random() * nbTgCanBeDisplayed) - 1;
		var modelToTest = enableModelList.get(randomIndex);
		
		if (listeTgToDisplay.contains(modelToTest) == - 1) {
			listeTgToDisplay.add(modelToTest);
			nbTgFound++;
		}
	}
	
	//Affichage des TG
	for (var i = 0; i < listeTgToDisplay.length();
	i++) {
		var modelToDisplay = listeTgToDisplay.get(i);
		var idTg = "tg-" + modelToDisplay;
		
		displayBlocId(idTg);
	}
}

/**
* Permet de cacher ou non le bloc produit et d'afficher le picto new ou FIN lors du chargement des modeles a partir d'une liste de modele
* @param :
*    - httpStatus : le statut HTTP apres l'appel ajax
* @desc :
*    - pour chaque item, on va verfier sa visibilite, si elle est a true alors on affiche le produit, sinon on ne l'affiche pas
*/
var POST_LOAD_ITEM_MODEL_FUNCTION = function postItemModelService(httpStatus) {
	if (httpStatus == "200") {
		var currentServiceId = mapServiceId.get(_SERVICE_ITEM_MODEL);
		var nbItems = getNbItem(currentServiceId);
		if (nbItems == - 1) {
			isErrorErep = true;
		}
		checkModel(serviceId, idModel, _displayPrice, isFromModel);
		modelList = new ArrayList();
		modelList.add(idModel);
		if (typeof isAffichePictoGamme != "undefined" && isAffichePictoGamme == "1") {
			setPictoGamme(_urlFamille + "/index.shtml", idModel);
		}
		checkSwitchProductPages(true, modelList);
	}
}

/**
* Permet de verifier les switchs apres la recuperation des prix
*/
function checkSwitchProductPages(isModelPage, modelList) {
	//appel des interrupteurs
	var _switchArrayAChecker = new Array();
	_switchArrayAChecker[0] = SWITCH_ACTIVATION_PRIX;
	_switchArrayAChecker[1] = SWITCH_ACTIVATION_DEEE;
	_switchArrayAChecker[2] = SWITCH_ACTIVATION_MDR;
	_switchArrayAChecker[3] = SWITCH_ACTIVATION_MDR_SAISIE_PREDICTIVE
	if (isModelPage) {
		_switchArrayAChecker[4] = SWITCH_ACTIVATION_OXYLANE_AVIS;
		_switchArrayAChecker[5] = SWITCH_ACTIVATION_DOC_ASSOCIES;
		_switchArrayAChecker[6] = SWITCH_ACTIVATION_LIAGE_DKT;
	}
	if(!switchDejaFait){
		switchDejaFait=true;
		checkSwitches(_switchArrayAChecker, _client, _siteNumber, modelList);
	}
}

/**
* Permet de cacher ou non le bloc produit et d'afficher le picto new
* @param :
*    - _serviceId : l'identifiant du service en court
*    - _isDisplayPrice : true/false doit on gerer l'affichage des prix
*/
function checkModels(_serviceId, _isDisplayPrice) {
	if (modelList && modelList.length() > 0) {
		//Nb de modele a verifier
		nbModelToCheck = modelList.length();
		//Pour chaque modele de la liste global, on va recuperer l'objet Item
		for (var ii = 0; ii < modelList.length();
		ii++) {
			var modelId = modelList.get(ii);
			//identifiant du modele a verifier
			checkModel(_serviceId, modelId, _isDisplayPrice, false);
		}
		//pour tous les produits a desactiver, on va les cacher
		for (var i = 0; i < disableProductList.length();
		i++) {
			var productToHideObj = disableProductList.get(i);
			hideBloc(productToHideObj);
		}
		
		//check des switchs
		if(!_isFamilySlideShow){
			checkSwitchProductPages(false, modelList);
		}
		
		//on va cacher le message d'attente
		hideWaitingMessage();
	}
}

/**
* Permet de cacher ou non le bloc produit et d'afficher le picto new
* @param :
*    - isDisplayPrice : true/false doit on gerer l'affichage des prix
*/
function checkModel(serviceId, idModel, isDisplayPrice, isFromModel) {
	if (idModel) {
		var forceDisplayBlock = false;
		var item = getMyItem(serviceId, idModel);
		//on recupere l'objet Item associe
		//on recupere les blocs HTML a afficher ou a cacher
		//5 types :
		//    - vignetteproduit : utilise dans les pages familles
		//    - ligneproduit : utilise dans les pages GDBC
		//    - compare : utilise dans les pages comparateurs
		//    - maSelection : utilise dans la page "Mes produits favoris"
		//    - bloc-vente : utilise dans la page produit
		var blocItemObj = getElement("vignetteproduit-" + idModel, true, "");
		forceDisplayBlock = true;
		if (blocItemObj == null) {
			blocItemObj = getElement("ligneproduit-" + idModel, true, "");
			forceDisplayBlock = true;
			if (blocItemObj == null) {
				blocItemObj = getElement("compare-" + idModel, true, "");
				forceDisplayBlock = true;
				if (blocItemObj == null) {
					blocItemObj = getElement("maSelection" + idModel, true, "");
					forceDisplayBlock = true;
					if (blocItemObj == null) {
						blocItemObj = getElement("bloc-prix" + idModel, true, "");
						forceDisplayBlock = false;
						if (blocItemObj == null) {
							blocItemObj = getElement("decouvrirplus" + idModel, true, "");
							forceDisplayBlock = false;
						}
					}
				}
			}
		}
		//Si la reponse erep est fausse, on va quand meme afficher les produits
		if (isErrorErep) {
			if (isFromModel) {
				//redirectProduit(idModel, _urlFamille) //_urlFamille doit etre declare dans l'html
				hideBlocId("ouAcheter");
			}
			if (! forceDisplayBlock) {
				nbModelHidden++;
				//hideBloc(blocItemObj) ; //Par defaut, le bloc est cache
				disableProductList.add(blocItemObj);
			} 
			else {
				displayBloc(blocItemObj);
				//Par defaut, le bloc est affiche
			}
		}
		//Item existe donc on va recuperer les prix 
		else if (item != null) {
			//Traitement que si le bloc HTML existe ou si on est dans le cas du slideshow
			if (blocItemObj || _isFamilySlideShow) {
				var isEnable = item.isEnable();
				//l'item est-il valable, faut il l'afficher
				var step = item.getStep();
				//recuperation de son etat : 1/2 ou 3
				if (step == "-1" || ! item.isStepHomogeneous()) {
					//Si les tapes du modle ne sont pas homogne, on va forcer l'tape du produit  1
					step = "1";
				}
				//Si l'item n'est pas valable, alors on cache le bloc HTML correspondant
				if (! isEnable) {
					if (! isFromModel) {
						//hideBloc(blocItemObj) ;
						disableProductList.add(blocItemObj);
						nbModelHidden++;
					} else {
						redirectProduit(idModel, _urlFamille) //_urlFamille doit etre declare dans l'html
					}
				}
				//sinon on l'affiche apres avoir verifie son etape de vie pour afficher les pictos NEW ou FIN 
				else {
					//le modele est coherent et peut donc etre affiche, on l'ajoute a la liste
					enableModelList.add(idModel);
					
					if (blocItemObj){
						if (step == "2") {
							//etape de vie 2, picto NEW a afficher
							//Cas d'une fiche produit
							var enteteProduit = getElement("entete-produit", true, "");
							var pictoNew = getElement("pictoNew", true, "");
							if (pictoNew) {
								displayBloc(pictoNew);
								var messageNew = getElement("message-new", true, "");
								displayBloc(messageNew);
								hideBlocId("titrePrix");
								displayBlocId("ouAcheter");
								displayBlocId("bloc-prix" + idModel);
							} 
							else if (enteteProduit) {
								enteteProduit.className = "new";
								var messageNew = getElement("message-new", true, "");
								displayBloc(messageNew);
								displayBlocId("ouAcheter");
								displayBlocId("bloc-prix" + idModel);
								//on va egalement modifier la classe picto gamme pour le bouton new
								//L'affichage de ce picto se fait dans la css page-produit.css
								var pictoGammeObj = getElement("picto-prix-new");
								if (pictoGammeObj) {
									pictoGammeObj.className = "picto-prix new";
									displayBloc(pictoGammeObj);
								}
							} 
							else if (getElement("picto-new-" + idModel, true, "")) {
								//cas comparer produit
								displayBloc(getElement("picto-new-" + idModel, true, ""));
								var blocCompareItemObj = getElement("col-" + idModel, true, "");
								if (blocCompareItemObj) {
									blocCompareItemObj.className = "col1new";
								}
							} 
							else {
								//autre cas
								blocItemObj.className = "new";
							}
						} 
						else if (step == "3") {
							//etape de vie 3, picto FIN a afficher
							var enteteProduit = getElement("entete-produit", true, "");
							var pictoFin = getElement("pictoFin", true, "");
							if (pictoFin) {
								displayBloc(pictoFin);
								displayBlocId("ouAcheter");
								displayBlocId("bloc-prix" + idModel);
							} else if (enteteProduit) {
								enteteProduit.className = "fin";
								//on va egalement modifier la classe picto gamme pour le bouton fin
								//L'affichage de ce picto se fait dans la css page-produit.css
								var pictoGammeObj = getElement("picto-prix-fin");
								if (pictoGammeObj) {
									pictoGammeObj.className = "picto-prix fin";
									displayBloc(pictoGammeObj);
								}
							}
						}
						//on va afficher les prix Decathlon si le modele est en etape de vie different de 2 et que le booleen isDisplayPrice est a true
						if (step != "2") {
							var messageNew = getElement("message-new", true, "");
							if (messageNew) {
								hideBloc(messageNew);
							}
							var displayBlocItem = true;
							if (isDisplayPrice && item.getMainPrice() != null) {
								//Rcuperation de l'objet Prices qui contient tous les types de prix
								var oPrice = item.getPrices();
								var oCurrency = oPrice.getCurrency();
								//objet Currency qui va permettre de formater correctement le prix
								if (oCurrency) {
									var oMainPrice = item.getMainPrice();
									//Prix principal = prix central
									var valuePrice = oCurrency.formatValue(oMainPrice.getValue());
									//on formatte le prix central
									var isHomogenous = oMainPrice.isPriceHomogeneous();
									var oWeeePrice = item.getWeeePrice();
									//Prix deee
									if (oWeeePrice != null) {
										var valuePriceWeee = oCurrency.formatValue(oWeeePrice.getValue());
										//on formatte le prix central
									} else {
										var valuePriceWeee = "";
									}
									if (valuePrice != "") {
										//Prix au kg
										var prixKg = getPriceByKg(oMainPrice, oCurrency);
										if (prixKg != "") {
											var blocPxKgHtml = getElement("infoplus-valeur-prxKg", true, "");
											if (blocPxKgHtml) {
												blocPxKgHtml.innerHTML = prixKg;
											}
										} else {
											var blocPxKgHtml = getElement("prixKgCell", true, "");
											if (blocPxKgHtml) {
												hideBloc(blocPxKgHtml);
											}
											var blocPxKgJurHtml = getElement("prixKgJur", true, "");
											if (blocPxKgJurHtml) {
												hideBloc(blocPxKgJurHtml);
											}
											var blocPoidsHtml = getElement("poidsCell", true, "");
											if (blocPoidsHtml) {
												hideBloc(blocPoidsHtml);
											}
										}
										//############ GESTION DES FILTRES/TRIS ############
										if (typeof activerTri != "undefined" && activerTri) {
											if (! isFromModel) {
												var valueObj = oMainPrice.getValue();
												rangeModelByPrice(valueObj, valuePrice, step, idModel);
											}
										}
										var fonctionGoToProduct = getLinkToDecathFunction(_urlErep, idModel, _siteRepositoryEnseigne);
										setPrixDecathlon(idModel, valuePrice, valuePriceWeee, isHomogenous, _language, fonctionGoToProduct);
										
										//on va afficher le bloc prix
										var blocPrixObj = getElement("bloc-prix" + idModel, true, "");
										if (blocPrixObj) {
											displayBloc(blocPrixObj);
										}
									} else {
										displayBlocItem = false;
									}
								} else {
									displayBlocItem = false;
								}
							}
							//on va afficher le bloc produit
							if (displayBlocItem) {
								if (blocItemObj.id != "decouvrirplus" + idModel && blocItemObj.id != "vignetteproduit-" + idModel) {
									displayBloc(blocItemObj);
								} else {
									possibleAAfficher.add(blocItemObj.id);
								}
							}
						} 
						else {
							if (blocItemObj.id == "decouvrirplus" + idModel) {
								possibleAAfficher.add(blocItemObj.id);
							}
							//on va ranger les produit nouveaute dans la liste des tris
							if (typeof activerTri != "undefined" && activerTri) {
								rangeModelByPrice("", "", step, idModel);
							}
							//si le client vient d'un autre pays, on va cacher le bloc prix pour les produits en tape de vie 2
							var valueCookieCountry = getCookie("country");
							var isFromOtherCounrty = false;
							if (valueCookieCountry) {
								if (valueCookieCountry != "FR" && valueCookieCountry != "EN" && valueCookieCountry != "ES" && valueCookieCountry != "IT") {
									isFromOtherCounrty = true;
								}
							}
							if (isFromOtherCounrty) {
								var divOuAcheterElement = getElement("ouAcheter", true, "");
								if (divOuAcheterElement) {
									hideBloc(divOuAcheterElement);
								}
							}
						}
					}
				}
			}
		} else {
			//dans le cas ou l'item est null, on va cacher le bloc produit
			nbModelHidden++;
			//hideBloc(blocItemObj) ; //Par defaut, le bloc est cache
			disableProductList.add(blocItemObj);
			//Au lieu de le cacher directement, on va mettre le bloc a cacher dans une liste qu'on parcourera plus tard pour cacher les bons blocs => pas de risque de desynchro
		}
	}
}
/**
* Permet de classer les produits par prix
*/
function rangeModelByPrice(_valueObj, _valuePrice, _step, _idModel) {
	var listeModelByPrice = "";
	var valuePrice = "";
	//On va mettre a jour l'objet ItemSite
	if (typeof modelObjByIdMap != "undefined") {
		var itemSite = modelObjByIdMap.get(_idModel);
		//Traitement step != 2
		if (_valuePrice != "") {
			if (itemSite) {
				itemSite.setPrixMag(_valuePrice);
			}
			//Cast du prix en float : va permettre de trier plus facilement
			valuePrice = parseFloat(_valueObj.integer + "." + _valueObj.decimal);
			//Remplacement du , par .
		} else {
			//Traitement step == 2
			if (_step == "2") {
				itemSite.setIsNew(true);
			}
			valuePrice = "NEW";
		}
		//Initialisation de la liste des modeles par prix
		var index = - 1;
		//Est ce qu'il a deja ete cree
		if (priceModelMap.get(valuePrice)) {
			listeModelByPrice = priceModelMap.get(valuePrice);
			index = priceModelMap.remove(valuePrice);
		} else {
			//Sinon on le cree
			listeModelByPrice = new ArrayList();
		}
		//On rajoute le modele pour cette valeur de prix
		listeModelByPrice.add(_idModel);
		//On insert cette liste de modele pour cette valeur de prix dans la map
		if (index == - 1) {
			priceModelMap.put(valuePrice, listeModelByPrice);
		} else {
			priceModelMap.putIn(index, valuePrice, listeModelByPrice);
		}
	}
}
/**
* Permet de charger tous les items de la famille
* @param :
*    - _client : ITOOL
*    - _familyId : l'identifiant de la famille masterdata
*    - _idSite : l'identifiant du site
*    - _idCentral : identifiant de la centrale
*    - _displayPrice : recuperation ou non des prix
* @desc :
*    - recupere le serveur erep, initialise ce serveur et charge tous les items de la famille
*/
function getFamily(_client, _familyId, _idSite, _idCentral, _displayPrice, _isDisplayAssortiment) {
	//on va verifier si le client ne vient pas d'un autre pays
	var idCentral = _idCentral;
	var valueCookieCountry = getCookie("country");
	if (valueCookieCountry) {
		var enseigneSiteObj = mapUrlParPays.get(valueCookieCountry);
		if (enseigneSiteObj) {
			idCentral = enseigneSiteObj.getCentrale();
		}
	}
	if (idCentral != "-1") {
		var isSlideShow = false ;
		
		//Fiche produit de type 1
		if (typeof _modeleCourant  == "string"){
			isSlideShow = true;
		}
		
		loadFamily(_client, _familyId, _idSite, _displayPrice, _isDisplayAssortiment, idCentral, POST_LOAD_ITEM_FAMILY_FUNCTION, isSlideShow);
	} else {
		displayProducts();
	}
}
/**
* Permet de charger tous les items de la famille
* @param :
*    - _client : ITOOL
*    - _familyId : l'identifiant de la famille masterdata
*    - _idSite : l'identifiant du site
*    - _idCentral : identifiant de la centrale
*    - _displayPrice : recuperation ou non des prix
* @desc :
*    - recupere le serveur erep, initialise ce serveur et charge tous les items de la famille
*/
function getFamilyModel(_client, _familyId, _currentModel, _idSite, _idCentral, _displayPrice, _isDisplayAssortiment) {
	//on va verifier si le client ne vient pas d'un autre pays
	var idCentral = _idCentral;
	var valueCookieCountry = getCookie("country");
	if (valueCookieCountry) {
		var enseigneSiteObj = mapUrlParPays.get(valueCookieCountry);
		if (enseigneSiteObj) {
			idCentral = enseigneSiteObj.getCentrale();
		}
	}
	if (idCentral != "-1") {
		var isSlideShow = true ;
		var displayPrice = true ;
		isFromModel = true ;
		loadFamily(_client, _familyId, _idSite, displayPrice, _isDisplayAssortiment, idCentral, POST_LOAD_ITEM_FAMILY_FUNCTION, isSlideShow);
	}
	else {
		displayProducts();
	}
}
/**
* Permet de charger tous les items a partir d'une liste de modeles
* @param :
*    - _client : ITOOL
*    - _familyId : l'identifiant de la famille masterdata
*    - _idSite : l'identifiant du site
*    - _idCentral : identifiant de la centrale
*    - _displayPrice : recuperation ou non des prix
*    - _isFromTg : Affichage depuis les TG de la HP
* @desc :
*    - recupere le serveur erep, initialise ce serveur et charge tous les items de la famille
*/
function getModels(_client, _idSite, _idCentral, _isDisplayPrice, _isDisplayAssortiment, _isFromTgHp) {
	//on va verifier si le client ne vient pas d'un autre pays
	var idCentral = _idCentral;
	var valueCookieCountry = getCookie("country");
	
	if (valueCookieCountry) {
		var enseigneSiteObj = mapUrlParPays.get(valueCookieCountry);
		if (enseigneSiteObj) {
			idCentral = enseigneSiteObj.getCentrale();
		}
	}
	if (idCentral != "-1") {
		loadModels(_client, _idSite, idCentral, POST_LOAD_ITEM_MODELS_FUNCTION, _isDisplayPrice, _isDisplayAssortiment, _isFromTgHp);
	} 
	else {
		hideWaitingMessage();
	}
}

/**
* Permet de charger tous les items a partir d'une liste de modeles
* @param :
*    - _client : ITOOL
*    - _idModel : l'identifiant du modele (reference modele)
*    - _idSite : l'identifiant du site
*    - _idCentral : identifiant de la centrale
* @desc :
*    - recupere le serveur erep, initialise ce serveur et charge l'item correspondant au modele
*/
function getModel(_client, _idSite, _idCentral, _idModel, _isDisplayPrice, _isDisplayAssortiment, _isFromModel) {
	//on va verifier si ce produit est deja dans la liste des favoris ou non
	verifMaSelection(_idModel);
	//on va verifier si le client ne vient pas d'un autre pays
	var idCentral = _idCentral;
	var language = _language;
	var valueCookieCountry = getCookie("country");
	if (valueCookieCountry) {
		var enseigneSiteObj = mapUrlParPays.get(valueCookieCountry);
		if (enseigneSiteObj) {
			idCentral = enseigneSiteObj.getCentrale();
		}
	}
	if (idCentral != "-1") {
		loadModel(_client, _idSite, idCentral, _idModel, language, _isDisplayPrice, _isDisplayAssortiment, _isFromModel, POST_LOAD_ITEM_MODEL_FUNCTION);
	} else {
		//on va cacher le bloc ou acheter et les blocs oxylane
		var divOuAcheterElement = getElement("ouAcheter", true, "");
		if (divOuAcheterElement) {
			hideBloc(divOuAcheterElement);
		}
		var divOxyClubElement = getElement("oxylaneClub", true, "");
		if (divOxyClubElement) {
			hideBloc(divOxyClubElement);
		}
	}
}
/**
* Permet de charger tous les items d'une famille et de lancer le traitement post appel Ajax
* @param :
*    - _client : ITOOL
*    - _familyId : l'identifiant de la famille a recuperer
*    - _subNumber1 : l'identifiant du site
*    - _bPriceData : recuperation ou non des prix
*    - _number2 : l'id de la centrale
*    - _localfunc : la fontion post ajax a appeler : par ex, POST_LOAD_SWITCH_VENTE_FUNCTION
* @desc :
*    - recupere le serveur erep, initialise ce serveur et charge tous les items de la famille
*/
function loadFamily(_client, _familyId, _idSite, _bPriceData, displayAssortiment, _idCentral, _localfunc, _isSlideShow) {
	//doit on afficher les informations prix
	_displayPrice = _bPriceData;
	_displayAssortiment = displayAssortiment;
	_isFamilySlideShow = _isSlideShow ;
	
	//recupere le serveur eRep
	_urlErep = getUrlErep(_SERVICE_ITEM_FAMILY, _client, THIRD_KIND_SITE, _idSite, _familyId, _localfunc, _displayPrice, _displayAssortiment);
	if (_urlErep) {
		//initialise le service
		serviceId = initExecuteService(_urlErep, _language, _idSite, _idCentral, CONTEXT_MODE_FAMILLE, _familyId, _localfunc, _displayPrice, _displayAssortiment);
		mapServiceId.put(_SERVICE_ITEM_FAMILY, serviceId);
	}
}
/**
* Permet de charger tous les items a partir d'une liste de modeles et de lancer le traitement post appel Ajax
* @param :
*    - _client : ITOOL
*    - _familyId : l'identifiant de la famille a recuperer
*    - _subNumber1 : l'identifiant du site
*    - _bPriceData : recuperation ou non des prix
*    - _number2 : ""
*    - _localfunc : la fontion post ajax a appeler : par ex, POST_LOAD_SWITCH_VENTE_FUNCTION
* @desc :
*    - recupere le serveur erep, initialise ce serveur et charge tous les items de la liste de modeles
*/
function loadModels(_client, _idSite, _idCentral, _localfunc, isDisplayPrice, displayAssortiment, _isFromTgHp) {
	//recupere le serveur eRep
	_displayPrice = isDisplayPrice;
	_displayAssortiment = displayAssortiment;	
	
	if(typeof _isFromTgHp != "undefined"){
		isFromTgHp = _isFromTgHp;
	}
	
	_urlErep = getUrlErep(_SERVICE_ITEM_MODELS, _client, THIRD_KIND_SITE, _idSite, "", _localfunc, _displayPrice, _displayAssortiment);
	if (_urlErep) {
		if (modelList && modelList.length() > 0) {
			//initialise le service
			serviceId = initExecuteService(_urlErep, _language, _idSite, _idCentral, CONTEXT_MODE_MODELES, modelList, _localfunc, _displayPrice, _displayAssortiment);
			mapServiceId.put(_SERVICE_ITEM_MODELS, serviceId);
		} 
		else {
			//Dans le cas des ventes complementaire, on va cacher le bloc si aucun produit n'est dans la VC
			hideBlockModels("bloc-decouvrirplus");
		}
	}
}
/**
* Permet de charger tous les items d'une famille et de lancer le traitement post appel Ajax
* @param :
*    - _client : ITOOL
*    - _idSite : l'identifiant du site
*    - _idCentral : l'identifiant de la centrale
*    - _idModel : identifiant du modele
*    - _language : FR|EN|ES|IT ...
*    - _localfunc : la fontion post ajax a appeler : par ex, POST_LOAD_SWITCH_VENTE_FUNCTION
* @desc :
*    - recupere le serveur erep, initialise ce serveur et charge tous les items de la famille
*/
function loadModel(_client, _idSite, _idCentral, _idModel, _language, _isDisplayPrice, _isDisplayAssortiment, _isFromModel, _localfunc) {
	//doit on afficher les informations prix
	_displayPrice = _isDisplayPrice;
	_displayAssortiment = _isDisplayAssortiment;
	isFromModel = _isFromModel;
	//recupere le serveur eRep
	_urlErep = getUrlErep(_SERVICE_ITEM_MODEL, _client, THIRD_KIND_SITE, _idSite, _idModel, _localfunc, _displayPrice, _displayAssortiment);
	idModel = _idModel;
	if (_urlErep) {
		//Initialisation et execution du service
		serviceId = initExecuteService(_urlErep, _language, _idSite, _idCentral, CONTEXT_MODE_MODELE, _idModel, _localfunc, _displayPrice, _displayAssortiment);
		mapServiceId.put(_SERVICE_ITEM_MODEL, serviceId);
	}
}
/**
* Permet de cacher le bloc de vente complementaire si tous les produits de la vente sont desactives
* @param :
*    - idBlockToHide : bloc VC a cacher
*/
function hideBlockModels(idBlockToHide) {
	var blockToHide = getElement(idBlockToHide, true, "");
	if (! blockToHide) {
		if (parent) {
			blockToHide = parent.document.getElementById(idBlockToHide);
		}
	}
	if (blockToHide) {
		//Si le nb de bloc cache est egal au nb de modele a afficher dans la VC, alors on va cacher ce bloc
		if (nbModelToCheck == nbModelHidden) {
			hideBloc(blockToHide);
		}
	}
	completeAffiche();
}
/*verifie si les VC selectionner alatoirement sont affichable et en selectionne d'autre si elles ne font pas partie des produit affichable*/
function completeAffiche() {
	var pdtAffiche = document.getElementsByTagName("LI");
	var nbVC = pdtAffiche.length;
	if (nbVC > 6 && possibleAAfficher.length() >= 6) {
		var afficher = selectionAleatoire(nbVC);
		for (var i = 0; i < afficher.length; i++) {
			if (pdtAffiche[afficher[i]].style.display == "none") {
				if (possibleAAfficher.contains(pdtAffiche[afficher[i]].id)) {
					pdtAffiche[afficher[i]].style.display = "block";
					verif = true;
				} else {
					verif = false;
				}
				while (! verif) {
					indice = Math.ceil(Math.random() * nbVC) - 1;
					var j = 0;
					verif = true;
					while (j < 6 && verif) {
						verif =(afficher[j] != indice);
						j++;
					}
					if (verif) {
						if (possibleAAfficher.contains(pdtAffiche[indice].id)) {
							pdtAffiche[indice].style.display = "block";
							afficher[i] = indice;
						} else {
							verif = false;
						}
					}
				}
			}
		}
	} else {
		for (var i = 0; i < possibleAAfficher.length();
		i++) {
			document.getElementById(possibleAAfficher.get(i)).style.display = "block";
		}
	}
}
/*selectionne 4 positions alatoirement parmit toutes les VC disponible
-nbPdt : nombre de produit disponible
*/
function selectionAleatoire(nbPdt) {
	if (nbPdt > 6) {
		var dejaAfficher =[ - 1, - 1, - 1, - 1, - 1, - 1];
		for (var l = 0; l < 6; l++) {
			var verifier = false;
			var indice = Math.ceil(Math.random() * nbPdt) - 1;
			while (! verifier) {
				var j = 0;
				verifier = true;
				while (j < l && verifier) {
					verifier =(dejaAfficher[j] != indice);
					j++;
				}
				if (! verifier) indice = Math.ceil(Math.random() * nbPdt) - 1;
			}
			dejaAfficher[l] = indice;
		}
	} else {
		var dejaAfficher =[0, 1, 2, 3, 4, 5];
	}
	return dejaAfficher;
}
/*verif si une VC fait partie des VC selectionner aleatoirement
tab : tableau des position selectionne
pos : position a tester
*/
function verifAffichage(tab, pos) {
	var estAAfficher = false;
	var i = 0;
	while (! estAAfficher && i < tab.length) {
		estAAfficher =(tab[i] == pos);
		i++;
	}
	return estAAfficher;
}
/**
* Permet de recupErer le poids d'un modele et son unite
*/
function getPriceByKg(_mainPrice, _currencyObject) {
	var poidsModeleObj = getElement("poids_modele", true, "");
	var uniteModeleObj = getElement("unite_modele", true, "");
	var valeurPoidsModele = "";
	var unitePoidsModele = "";
	if (poidsModeleObj && uniteModeleObj) {
		valeurPoidsModele = poidsModeleObj.innerHTML;
		unitePoidsModele = uniteModeleObj.innerHTML;
	}
	if ((unitePoidsModele == "Kg" || unitePoidsModele == "L") && valeurPoidsModele > 0) {
		var priceValue = _mainPrice.getValue();
		var priceByKg = parseFloat(priceValue.getInteger() + "." + priceValue.getDecimal()) / valeurPoidsModele;
		priceByKg = Math.round(priceByKg * 100) /100;
				
		//convertion en string pour separer la partie entiere et decimale et construire l objet value
		priceByKg = priceByKg.toString();
		var priceByKg_value = null;
		//Objet Value
		if (priceByKg.indexOf('.') != - 1) {
			var priceByKg_value = new JoValue();
			priceByKg_value.setInteger(priceByKg.substring(0, priceByKg.indexOf('.')));
			priceByKg_value.setDecimal(priceByKg.substring(priceByKg.indexOf('.') + 1));
		} else {
			var priceByKg_value = new JoValue();
			priceByKg_value.setInteger(priceByKg);
			priceByKg_value.setDecimal(0);
		}
		// construction de l objet currency pour utiliser la methode de formatage du prix
		var oCurrency = new JoCurrency();
		oCurrency.setId(_currencyObject.getId());
		oCurrency.setBehind(_currencyObject.isBehind());
		oCurrency.setSymbol(_currencyObject.getSymbol());
		oCurrency.setDecimalNumber(_currencyObject.getDecimalNumber());
		oCurrency.setDecimalDelimiter(_currencyObject.getDecimalDelimiter());
		oCurrency.setThousandDelimiter(_currencyObject.getThousandDelimiter());
		if (oCurrency) {
			return oCurrency.formatValue(priceByKg_value) + ' / ' + unitePoidsModele;
		} else {
			return "";
		}
	} else {
		return "";
	}
}
/** #########################################
* Permet d'afficher le message d'erreur de non dispo d'un produit
*/
function checkPageStatus() {
	// Doit on afficher le message de non dispo du produit
	var paramsUrl = getParameters();
	if (paramsUrl.length > 0 && paramsUrl[0] != "") {
		if ((paramsUrl[0][0]).indexOf("?nondispo") > - 1) {
			if (paramsUrl[0][1] == "true") {
				displayBlocId("advertDispo");
			}
		}
	}
}
