_ASCR = "cachecache";
/* 

Sommaire :
I/		callbacks
II/		methodes et champs public
III/	param?tres des callback


callbacks :
-----------
ce sont des callback, ils prennent dont une fonction en valeur, exemple:
AttributObject.OnloadCallback = attribut_on_load;
a definir dans attribut.tpl, juste apres le "new AjaxAttributs()";

AttributObject.SelectionCallback = AttributSelect;
	appel? lors de la selection d'un attribut
	param?tre :
		AttributObject, SelectedDetail, NextAttribut, AvailableOptions
	
AttributObject.UnSelectionCallback = AttributUnSelect;
	appel? lors de la d?selection d'un attribut
	exemple :
		quand on selectionne un attribut plus haut dans l'arbo, 
		ou un attribut de meme niveau (est appel? sur l'ancienne valeur selectionn?e)
	param?tre :
		AttributObject, Attribut
	
AttributObject.SubmitCallback = AttributSubmit;
	appel? pour v?rifier l'etat des attributs.
	g?n?ralement c'est ici qu'on verifie si tous les attributs sont selectionn?s.
	param?tre :
		AttributObject
	
AttributObject.OnloadCallback = AttributOnLoad;
	appel? lors du chargement des attributs, juste apres la reception des donn?es en ajax.
	param?tre :
		AttributObject


methodes et champs disponibles :
--------------------------------
	AttributObject.ProduitID = ProduitID;
	AttributObject.PaysSite = PaysSite;
	AttributObject.LangueSite = LangueSite;

string AttributObject.ObjectID
	nom de l'objet a attribut

string AttributObject.GetAttributObjectID(AttributID);
	retourne le nom de l'object HTML affichant l'attribut.
	a utiliser lors de l'affichage des attributs (les fonctions Display...)
	Exemple : si affich? en select, c'est l'attribut "id" du select.

string AttributObject.GetAttributDetailID(AttributID, DetailID);
	retourne le nom de l'object HTML affichant un detail de l'attribut.
	a utiliser lors de l'affichage des attributs (les fonctions Display...)
	Exemple : si affich? en lien, c'est l'attribut "id" du lien.

string AttributObject.GetAttributDisplayObjectID(AttributID);
	retour le nom d'un champ <span> invisible, servant a positionner l'affichage d'un attribut.
	Ce <span> est ?crit dans le document lors de l'appel a DisplayAttribut() dans attribut.tpl
	
void AttributObject.AttributSelected(AttributID, DetailID);
	S?lectionne un attribut
	cette method est appel?e a la selection d'un select, ou au click sur une couleur par exemple.
	generalement, le code JS a taper pour l'appel est le suivant,
	exemple pour un lien :
	href='javascript:"+AttributObject.ObjectID+".AttributSelected("+Attribut.AttributID+", "+Details[i].DetailID+")'
	
void AttributObject.StepIn();
	avance d'un pas dans la selection des attributs.
	selectionne la premiere option disponible suivant.
	
void AttributObject.StepOut();
	deselectionne un attribut, et retourne au precedent

void AttributObject.AutoSelectNext();
	selectionne automatiquement tous les attributs si une seule option dispo



description des param?tres des fonctions :
------------------------------------------
AttributObject
	l'object AjaxAttribut.

Attribut, SelectedAttribut, NextAttribut
	contient un objet attribut, il a de dispo :
	Attribut.Libelle
	Attribut.AttributID
	Attribut.Tri
	Attribut.Details: c'est un tableau, contient la liste des valeurs de l'attributs :
		Attribut.Details[0].DetailID
		Attribut.Details[0].Libelle
		
SelectedDetail
	contient un object Detail, il a de dispo :
	SelectedDetail.DetailID
	SelectedDetail.Attribut: retourne l'objet attribut du detail
	SelectedDetail.Libelle
		
AvailableOptions
	tableau, contient une liste d'options :
	AvailableOptions[0].OptionID
	AvailableOptions[0].CodeEAN
	AvailableOptions[0].Libelle
	AvailableOptions[0].Majoration
	AvailableOptions[0].Stock
	AvailableOptions[0].DelaiLivID
	AvailableOptions[0].Attributs: c'est un tableau, contient la liste des attributs et des valeurs de l'option :
		AvailableOptions[0].Attributs[0].AttributID
		AvailableOptions[0].Attributs[0].DetailID
		AvailableOptions[0].Attributs[0].AttributOptionID
*/


function DisplayTaille (AttributObject, Attribut){
	var Content = "";
	
	//recup des valeurs de l'attribut
	var Details = Attribut.Details
	
	//ecriture du select, l'id du select est g?n?r? par l'objet AttributObject en fonction de l'attribut.
	Content += "<select id="+AttributObject.GetAttributObjectID(Attribut.AttributID)+" ";
	//appel la selection de l'attribut.
	Content += "onchange='"+AttributObject.ObjectID+".AttributSelected("+Attribut.AttributID+", this.value)'>";
	Content += "<option value=''></option>";
	/*if(Attribut.Tri == 1){
		//parcours des valeurs de l'attribut
		for(var i=0; i<Details.length; i++){
			Content += "<option value='"+Details[i].DetailID+"'>"+Details[i].Libelle+"</option>";
		}
	}*/
	Content += "</select>";

	//recup de l'objet HTML qui sert a l'affichage de l'attribut.
	var Obj = document.getElementById(AttributObject.GetAttributDisplayObjectID(Attribut.AttributID));
	Obj.innerHTML = Content;
}

function DisplayCouleur (AttributObject, Attribut){
	var Content = "";
	var Details = Attribut.Details
	
	for(var i=0; i<Details.length; i++){
		var Detail = Details[i];

		var s="";
		if (i%6==0 && i!=0) {
			s = "clear:both;"
		}

		Content += "<li style='"+s+"'>";
		Content += "<a style='color:black' ";
		Content += "href='javascript:"+AttributObject.ObjectID+".AttributSelected("+Attribut.AttributID+", "+Detail.DetailID+");' ";
		Content += ">";
		
		Content += "<img id='"+AttributObject.GetAttributDetailID(Attribut.AttributID, Detail.DetailID)+"' ";
		Content += "src='"+AttributObject.Datas.PageURL+"/ximg/selected.gif' style='position:absolute;display:none'>";
		Content += "<img src='/products_images/prod_"+AttributObject.ProduitID+"/picto_"+Detail.CodeCouleur+".jpg' ";
		Content += "alt='"+Detail.Libelle+"' ";
		Content += ">";
		
		Content += "</a>";
		Content += "</li>";
	}

	//recup de l'objet HTML qui sert a l'affichage de l'attribut.
	var Obj = document.getElementById(AttributObject.GetAttributDisplayObjectID(Attribut.AttributID));
	Obj.innerHTML = Content;
}

function DisplayStyloTaille(AttributObject, Attribut){
	var Content = "";
	
	//recup des valeurs de l'attribut
	var Details = Attribut.Details
	
	//ecriture du select, l'id du select est g?n?r? par l'objet AttributObject en fonction de l'attribut.
	Content += "<select id="+AttributObject.GetAttributObjectID(Attribut.AttributID)+" ";
	//appel la selection de l'attribut.
	Content += "onchange='"+AttributObject.ObjectID+".AttributSelected("+Attribut.AttributID+", this.value)'>";
	Content += "<option value=''></option>";
	/*if(Attribut.Tri == 1){
		//parcours des valeurs de l'attribut
		for(var i=0; i<Details.length; i++){
			Content += "<option value='"+Details[i].DetailID+"'>"+Details[i].Libelle+"</option>";
		}
	}*/
	Content += "</select>";
	
	//recup de l'objet HTML qui sert a l'affichage de l'attribut.
	var Obj = document.getElementById(AttributObject.GetAttributDisplayObjectID(Attribut.AttributID));
	Obj.innerHTML = Content;
}

function DisplayStyloCouleur(AttributObject, Attribut){
	var Content = "";
	var Details = Attribut.Details
	
	for(var i=0; i<Details.length; i++){
		var Detail = Details[i];

		var s="";
		if (i%6==0 && i!=0) {
			s = "clear:both;"
		}

		Content += "<li style='"+s+"'>";
		Content += "<a style='color:black' ";
		Content += "href='javascript:"+AttributObject.ObjectID+".AttributSelected("+Attribut.AttributID+", "+Detail.DetailID+");' ";
		Content += ">";
		
		Content += "<img id='"+AttributObject.GetAttributDetailID(Attribut.AttributID, Detail.DetailID)+"' ";
		Content += "src='"+AttributObject.Datas.PageURL+"/ximg/selected.gif' style='position:absolute;display:none'>";
		Content += "<img src='/products_images/prod_"+AttributObject.ProduitID+"/picto_"+Detail.CodeCouleur+".jpg' ";
		Content += "alt='"+Detail.Libelle+"' ";
		Content += ">";
		
		Content += "</a>";
		Content += "</li>";
	}

	//recup de l'objet HTML qui sert a l'affichage de l'attribut.
	var Obj = document.getElementById(AttributObject.GetAttributDisplayObjectID(Attribut.AttributID));
	Obj.innerHTML = Content;
}

//SelectedDetail: Detail venant d'etre selctionn?
//NextAttribut: le prochain attribut que l'utilisateur devra s?lectionner
//AvailableOptions: listes des options disponible pour cette selection
//					si tous les attributs sont selectionn?s, cette liste contient un seul element, ou zero si rien ne correspond.
function AttributSelect(AttributObject, SelectedDetail, NextAttribut, AvailableOptions){
	
	//switch sur le tri pour savoir quelle attribut vient d'etre selectionn?
	//on peut tres bien faire pareil sur le nom pour plus de comprehension :
	//switch(SelectedAttribut.Tri){
	//	case 1:
	switch(SelectedDetail.Attribut.AttributID){
		case 1: //couleur
			
			//exemple, l'attribut couleur est affich? en lien
			//lors de la selection, on passe le lien en question en rouge
			var Obj = document.getElementById(AttributObject.GetAttributDetailID(SelectedDetail.AttributID, SelectedDetail.DetailID));
			Obj.style.display = "block";
			
			//exemple, si le prochain attribut est affich? en <select>
			//alors on met a jour les valeurs possibles du select
			//la methode GetDetailsFromOptions() retourne uniquement les "Details" possible pour un attribut en fonction de la liste des options
			//on boucle donc sur les "Details" possibles de "NextAttribut"

			var Details = AttributObject.GetDetailsFromOptions(NextAttribut.AttributID, AvailableOptions);
			var Sel = document.getElementById(AttributObject.GetAttributObjectID(NextAttribut.AttributID));
			Sel.options.length = 1;
			
			for(var i=0; i<Details.length; i++){
			
				Sel.options[Sel.options.length] = new Option(Details[i].Libelle, Details[i].DetailID, false, false);
				//check si les options de cette taille on du stock
				var StockTotal = 0;
				var Options = AttributObject.FilterOptionsByDetails(AvailableOptions, Details[i].AttributID, Details[i].DetailID);
				for(var j=0; j<Options.length; j++){
					StockTotal += Options[j].Stock;
				}
				//si pas de stock, on grise l'entrée dans le select
				if(StockTotal < 1){
					Sel.options[Sel.options.length-1].style.color = "#BBBBBB";
					Sel.options[Sel.options.length-1].disabled = true;
				}
			}
			
			if(!AttributObject.Stylorama){
				//affichage/masquage des elements des autres vues
				var Gallery = document.getElementById("gallerie_list");
				var Images = Gallery.getElementsByTagName("li");
				var MainDisplayed = false;
				var Nbimage = 0;
				for(var i=0; i<Images.length; i++){
					var Img = Images[i];
					var ImgInfos = Img.title.split('_');
					var ImgAttID = ImgInfos[0];
					var ImgName = ImgInfos[1];
					
					if(ImgAttID == SelectedDetail.DetailID || ImgAttID == 0){
						//affichage de toutes les images gallerie sauf la front par defaut
						if(ImgName == "front" && ImgAttID == 0){
							Img.style.display = "none";
						}else{
							Img.style.display = "block";
						}
						Nbimage++;
						if(!MainDisplayed && ImgAttID != 0){
							MainDisplayed = true;
							document.getElementById("photoProduit").src = Img.getElementsByTagName("img")[0].src.replace("/a_", "/f_");
						}
					}else{
						Img.style.display = "none";
					}
				}
				if(!MainDisplayed){
					document.getElementById("photoProduit").src = "/products_images/nophoto.gif";
				}
				var GalleryDisplay = (Nbimage > 0)? "block" : "none";
				document.getElementById("gallerie_title").style.display = GalleryDisplay;
				document.getElementById("gallerie_list").style.display = GalleryDisplay;
				
				
				/*affichage du prix de la prochaine premiere option*/
				if(typeof UpdateTotal != "undefined" && AvailableOptions.length != 0){
					var S = new Array;
					for(var i=0; i<AttributObject.Datas.Soldes.length; i++){
						if(AttributObject.Datas.Soldes[i].CodeEAN == AvailableOptions[0].CodeEAN){
							S[S.length] = AttributObject.Datas.Soldes[i];
						}
					}
					UpdateTotal(AvailableOptions[0].Majoration, AvailableOptions[0].AncienMajoration, S);
				}
			}else{
				Img = document.getElementById("photo" + this.ProduitID);
				if(Img){
					Img.src = "/products_images/prod_" + this.ProduitID + "/d_" + AvailableOptions[0].CodeEAN + "_" + AvailableOptions[0].PhotoID + "_" + AvailableOptions[0].PhotoDetailID + ".jpg";
				}
			}
		break;

		default: 
			
			//tous les attributs sont selectionn?s
			//si aucune option n'est dispo, alors on affiche un message d'erreur
			if(AvailableOptions.length == 0){
				alert("aucun dispo !")
			}
						if(typeof UpdateTotal != "undefined" && AvailableOptions.length != 0){
				var S = new Array;
				for(var i=0; i<AttributObject.Datas.Soldes.length; i++){
					if(AttributObject.Datas.Soldes[i].CodeEAN == AvailableOptions[0].CodeEAN){
						S[S.length] = AttributObject.Datas.Soldes[i];
					}
				}
				UpdateTotal(AvailableOptions[0].Majoration, AvailableOptions[0].AncienMajoration, S);
			}
		break;
	}
	
	var StockTotal = 0;
	for(var i=0; i<AvailableOptions.length; i++){
		StockTotal += AvailableOptions[i].Stock;
	}
	if(StockTotal == 0){
		if(AttributObject.Stylorama){
			document.getElementById('link_'+AttributObject.FieldIdentifier).style.display = 'none';
			document.getElementById('non_'+AttributObject.FieldIdentifier).style.display = 'block';
		}else{
			document.forms['productform'].elements['validate'].style.display = 'none';
			document.getElementById("nostock").style.display = 'block';
		}
	}else{
		if(AttributObject.Stylorama){
			document.getElementById('link_'+AttributObject.FieldIdentifier).style.display = 'block';
			document.getElementById('non_'+AttributObject.FieldIdentifier).style.display = 'none';
		}else{
			document.forms['productform'].elements['validate'].style.display = 'block';
			document.getElementById("nostock").style.display = 'none';
		}
	}
}

function AttributUnSelect(AttributObject, Attribut){
	switch(Attribut.AttributID){
		case 1: //couleur
			//exemple, l'attribut couleur est affich? en lien
			//lors de la deselection, on enleve la bordure des liens
			for(var i=0; i<Attribut.Details.length; i++){
				var Obj = document.getElementById(AttributObject.GetAttributDetailID(Attribut.Details[i].AttributID, Attribut.Details[i].DetailID));
				if(Obj){
					Obj.style.display = "none";
				}
			}
			
		break;
		default: 
			
		break;
	}
}

function AttributSubmit(AttributObject){
	if(AttributObject.AvailableOptions.length != 1){
		alert(AttributObject.label_error_select_att);
		return false;
	}

	//renseignement des champs de formulaire
	if(!AttributObject.Stylorama){
		document.productform.code_ean.value = AttributObject.AvailableOptions[0].CodeEAN;
		document.productform.option_id.value = AttributObject.AvailableOptions[0].OptionID;
	}
	
	return true;
}

function AttributOnLoad(AttributObject){
	if(AttributObject.Stylorama){
		/* stylorama, fonctionnmeent bancal, on garde les attribut_id = 1, on remplace les autres par 2 */
	
		for(var i=0; i<AttributObject.Datas.Attributs.length; i++){
			AttributObject.Datas.Attributs[i].AttributID = (AttributObject.Datas.Attributs[i].AttributID == 1)? 1 : 2;
			for(var j=0; j<AttributObject.Datas.Attributs[i].Details.length; j++){
				AttributObject.Datas.Attributs[i].Details[j].AttributID = (AttributObject.Datas.Attributs[i].Details[j].AttributID == 1)? 1 : 2;
			}
		}
		for(var i=0; i<AttributObject.Datas.Options.length; i++){
			for(var j=0; j<AttributObject.Datas.Options[i].Attributs.length; j++){
				AttributObject.Datas.Options[i].Attributs[j].AttributID = (AttributObject.Datas.Options[i].Attributs[j].AttributID == 1)? 1 : 2;
			}
		}
	}
	document.getElementById('loader').style.display = "none";
}

function AttributOnLoaded(AttributObject){
	if(eval("couleur_"+AttributObject.ProduitID))
		AttributObject.AttributSelected(application_attribut_couleurID, eval("couleur_"+AttributObject.ProduitID));
	else AttributObject.StepIn();
}

function NumberFormat(nStr){
	nStr += '';
	x = nStr.split(',');
	x1 = x[0];
	x2 = x.length > 1 ? ',' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ' ' + '$2');
	}
	var r = x1 + "" + x2;
	return r.replace(".", ",");
}