function ctrl_field_numerique(maVar,qte_commandable)
{
     var monChamp = document.getElementById(maVar);
     if (eval(monChamp)){
       var valeur = monChamp.value;
       var numerique = parseInt(valeur);
       var estValide = !isNaN(numerique) && (numerique >0);
       if (!estValide){
        monChamp.value=""+qte_commandable;
       }
       var exp=new RegExp("^[0-9]*$","g");
       res = exp.test(valeur);
       if (!res){
         monChamp.value=""+qte_commandable;
       }
    }
}
function ctrl_field_numerique_byInput(monInput,qte_commandable)
{
     if (eval(monInput)){
       var valeur = monInput.value;
       var numerique = parseInt(valeur);
       var estValide = !isNaN(numerique) && (numerique >0);
       if (!estValide){
        monInput.value=""+qte_commandable;
       }
       var exp=new RegExp("^[0-9]*$","g");
       res = exp.test(valeur);
       if (!res){
         monInput.value=""+qte_commandable;
       }
    }
}

function ctrl_field_numerique_byInputs(monName,qte_commandable)
{
     var allInputs = document.getElementsByName(monName);
     if (allInputs!=null){
	for (var nbB=0 ; nbB < allInputs.length ; nbB++) {
		var monInput = allInputs[nbB];
		if (monInput!=null && eval(monInput)){
			ctrl_field_numerique_byInput(monInput,qte_commandable);
		}
	}
     }
}


function ctrlTouche(event)
{
	if (event.keyCode==13) {
		event.stopPropagation();
		event.preventDefault();
		return false;
	}
}


function ShoppingCartItem(cug, marque, ref_fournisseur, denom_commerciale, qte, prixProduit, ecoTaxe,pcb,minimumCommande, updateServerInfo,remoteCall) {
		this.getTotalQty = function() {
			return this.qte;
		}

		this.setTotalQty = function(totalQty) {
			this.qte = parseInt(totalQty, 10);
			remoteCall.setProductQuantity(this.cug, this.qte);
		}
		
		this.addQte = function(qte) {
			
      this.qte = parseInt(qte, 10);			
			if(updateServerInfo) {
				  remoteCall.addProduct(this.cug, this.qte);
			}
		}

		this.getTotalPrice = function() {
			if(isNaN(this.prixProduit)) {
				return (0.0);
			} else {
				return(this.prixProduit * this.qte);
			}
		}
		
		this.getTotalEcoTaxe = function() {
			if(isNaN(this.ecoTaxe)) {
				return (0.0);
			} else {
				return(this.ecoTaxe * this.qte);
			}
		}
		
		this.cug = cug;
    this.marque = marque;
    this.ref_fournisseur = ref_fournisseur;
    this.denom_commerciale = denom_commerciale;
    this.qte = qte;
    this.prixProduit = prixProduit;
    this.ecoTaxe = ecoTaxe;
    this.pcb = pcb;
    this.minimumCommande = minimumCommande;
		this.addQte( qte );
}

function Basket(remoteCall) {

	// Hashmap containing shoppingCartIem with key=cug
	this.shoppingCart = new Array();
	this.totalBasket=0;

	this._searchProductIndex = function(cug) {
		var index;
		for(var index=0 ; index<this.shoppingCart.length ; index++) {
			if(this.shoppingCart[index].cug == cug) {
				return index;
			}
		}

		return (-1);
	}

	this.initialize = function(cug, marque, ref_fournisseur, denom_commerciale, qte, prixProduit, ecoTaxe, pcb,minimumCommande) {
		qte = parseFloat(qte, 10);
		if(qte>0 && prixProduit!=0) {
			// creates item and adds it at the shoppingCart end if the quantity is positive
			var length = this.shoppingCart.length;
			this.shoppingCart[length] = new ShoppingCartItem(cug, marque, ref_fournisseur, denom_commerciale, qte, prixProduit, ecoTaxe,pcb,minimumCommande, false,remoteCall);
			//alert(this.shoppingCart[length].getTotalQty());
		}
	}
	
	this.addProductInShoppingCart = function(cug, marque, ref_fournisseur, denom_commerciale, qte, prixProduit, ecoTaxe,pcb,minimumCommande,updateServerInfo) {
		qty = parseFloat(qte, 10);
		addedTotalQty = qte;
		var itemIndex = this._searchProductIndex(cug);
		
		if(itemIndex != -1) {
			// Item already present in the shoppingCart
			spcItem = this.shoppingCart[itemIndex];
			addedTotalQty = parseInt(addedTotalQty) + parseInt(spcItem.getTotalQty());	      		
			addedTotalQty = this._setShoppingCartQuantity(itemIndex, addedTotalQty);
		} else {
			// creates item and adds it at the shoppingCart end if the quantity that can be added is positive
			if(qty>0) {
			   var length = this.shoppingCart.length;
				 this.shoppingCart[length] = new ShoppingCartItem(cug, marque, ref_fournisseur, denom_commerciale, qte, prixProduit, ecoTaxe,pcb,minimumCommande,updateServerInfo,remoteCall);
				 this._draw();
			 }
		}
		try {
			window.focus();
		} catch(e) {
		}
		//enable the div ticket de caisse dans le header
		var basketLineDiv = document.getElementById("basketLine");
		basketLineDiv.className="basketLine activeBasketLine";
		if(document.getElementById("displayCheckoutLink") == null){
			//ajout de la fleche permettant d'afficher
			var a = document.createElement("a");
			a.setAttribute("id","displayCheckoutLink");
			a.setAttribute("name","displayCheckoutLink");
			a.className="displayCheckoutLink";
			a.setAttribute("href","#headerCheckoutLayer");
			var span = document.createElement("span");
			var text = document.createTextNode("");
			span.appendChild(text);
			a.appendChild(span);
			basketLineDiv.appendChild(a);
		}else{
			var a = document.getElementById("displayCheckoutLink");
			a.className="displayCheckoutLink";
			basketLineDiv.removeChild(a);
			a.removeAttribute("style");	
			basketLineDiv.appendChild(a)
		}
	}

	this.removeProductFromShoppingCart = function(basketIndex) {
		var basketItem = this.shoppingCart[basketIndex];
		var tmpSpc = new Array(); // array which will contains items that are not removed

		var i=0; // index of this.shoppingCart
		var j=0; // index of tmpSpc

		while(i<this.shoppingCart.length) {
			if(i!=basketIndex) {
				tmpSpc[j] = this.shoppingCart[i];
				++j;
			}
			++i;
		}

		this.shoppingCart = tmpSpc;
		basketItem.setTotalQty(0);
	  this._draw();

		return basketItem;
	}

	/**
	   Set the total quantity of an item that already exists in the shoppingcart
	*/
	this._setShoppingCartQuantity = function(index, totalQty) {
		var spcItem = this.shoppingCart[index];
		var max = -1;
		if (eval(spcItem.maxAllowed))
			max = parseInt(spcItem.maxAllowed, 10);
		var packQty = parseInt(spcItem.qte, 10);
		
		totalQty = parseInt(totalQty, 10);
		if(totalQty > 0) {
			// Do we reach the maximum ?
			while(totalQty > max && max!=-1) {
				totalQty -= packQty;
			}
      if(totalQty%spcItem.pcb != 0){
          totalQty = (parseInt(totalQty/spcItem.pcb)+1)*spcItem.pcb;
          alert('Vous devez choisir un multiple de '+spcItem.pcb);
      }

			if(totalQty>spcItem.getTotalQty()) {
					spcItem.setTotalQty(totalQty);
					this._draw();
			} else {
				spcItem.setTotalQty(totalQty);
				this._draw();
			}
		} else { // qty <= 0
		    var tmpI = eval(index)+1;
        var spcItemGar = this.shoppingCart[tmpI];
        while(spcItemGar != null && (spcItemGar.marque == 'GARANTIE' || spcItemGar.marque == 'ASSURANCE')){
          this.removeProductFromShoppingCart(tmpI);
          spcItemGar = this.shoppingCart[tmpI];
        }
				this.removeProductFromShoppingCart(index);
				this._draw();
		}

		// Return the added quantity
		return totalQty;
	}

	this.decrementProduct = function(objet, index) {
		var spcItem = this.shoppingCart[index];
		var canDecrement = true;
		
		if(spcItem.getTotalQty()==1 || eval(spcItem.getTotalQty())-eval(spcItem.pcb) < spcItem.minimumCommande || eval(spcItem.getTotalQty())-eval(spcItem.pcb)<=0) {
      showPopinCheckout(null, "/rdc/popinRemoveProduit.jsp?indexTicket="+index);
      canDecrement = false;
    }
		
		if(canDecrement) {
    		  var tmpI = eval(index)+1;
          var spcItemGar = this.shoppingCart[tmpI];
          while(spcItemGar != null && (spcItemGar.marque == 'GARANTIE' || spcItemGar.marque == 'ASSURANCE')){
            spcItemGar.qte = eval(spcItem.getTotalQty())-eval(spcItem.pcb);
            tmpI++;
            spcItemGar = this.shoppingCart[tmpI];
          }
          this._setShoppingCartQuantity(index, eval(spcItem.getTotalQty())-eval(spcItem.pcb));
    }
	}
	this.removeProduct = function(index) {
		var spcItem = this.shoppingCart[index];
    this._setShoppingCartQuantity(index, 0);
	}

	this.incrementProduct = function(index) {
		var spcItem = this.shoppingCart[index];
    var tmpI = index+1;
    var spcItemGar = this.shoppingCart[tmpI];
    while(spcItemGar != null && (spcItemGar.marque == 'GARANTIE' || spcItemGar.marque == 'ASSURANCE')){
      spcItemGar.qte = eval(spcItem.getTotalQty())+eval(spcItem.pcb);
      tmpI++;
      spcItemGar = this.shoppingCart[tmpI];
    }
    this._setShoppingCartQuantity(index, eval(spcItem.getTotalQty())+eval(spcItem.pcb));
	}

	this.getTotalAmount = function() {
		var amount = 0.0;
		for(var i=0 ; i<this.shoppingCart.length ; i++) {
			amount += this.shoppingCart[i].getTotalPrice();
		}

		return amount;
	}
	
	this.getTotalEcoTaxe = function() {
		var eco = 0.0;
		for(var i=0 ; i<this.shoppingCart.length ; i++) {
			eco += this.shoppingCart[i].getTotalEcoTaxe();
		}
		return eco;
	}
  
	this.removeAllItems = function(basket) {
  	if (eval(basket)){
    	clearBasket(basket);	
    	this.shoppingCart = new Array();
    	
    
    	remoteCall.removeAllItems();
    	this._draw();
    	//defect 1420 on efface tout le panier
    	var divBasketLine = document.getElementById("basketLine");
    	divBasketLine.className="basketLine";
    
    	//dernier child a
    	var a = document.getElementById("displayCheckoutLink");//divBasketLine.lastChild;
    	divBasketLine.removeChild(a);
    	a.className=" ";
    	divBasketLine.appendChild(a);
    	
    	var checkoutDisplay = document.getElementById('checkoutDisplay');
    	var headerCheckoutLayer = document.getElementById('headerCheckoutLayer');
    	
    	checkoutDisplay.removeChild(headerCheckoutLayer);
    	headerCheckoutLayer.setAttribute("style","display:none");
    	checkoutDisplay.appendChild(headerCheckoutLayer);
    	headerCheckoutLayer.style.display='none';
    }
	}
	
	this._draw = function() {
		graphicBasket.drawBasket(this);
	}
}


function clearBasket(basket) {
	var basketTableAll = document.getElementsByName("contentTicketCaisse");
	if (basketTableAll != null){
		for (var nbB=0 ; nbB < basketTableAll.length ; nbB++) {
			var basketTable = basketTableAll[nbB];
			if (basketTable != null){
				if (eval(basket) && basket.shoppingCart.length !=0){
					var childs =basketTable.childNodes;
					if (childs != null && childs.length > 0){
						var nbChilds = childs.length-1;
						for(var i= nbChilds ; i>=0 ; i--) {
							basketTable.removeChild(childs[i]);
						}
					}
				}
			}
		}
	}
}

function GraphicBasket(basket) {
  
	this._updateTotalAmount = function(basket) {
	  if (eval(basket)){
  		var amountDiv = document.getElementsByName("nbPrixTotal");
  		if(amountDiv!=null) {
  			var text = this._amountToString(basket.getTotalAmount()/100);
  			for (var i = 0 ; i < amountDiv.length ; i++){
  				amountDiv[i].firstChild.data = text;
  			}
  		}
  		var ecoDiv = document.getElementsByName("nbEcoPartTotal");
  		if(ecoDiv!=null) {
  			for (var i = 0 ; i < ecoDiv.length ; i++){
  				while (ecoDiv[i].firstChild) {
  					ecoDiv[i].removeChild(ecoDiv[i].firstChild);
  				}
  		  	   if(basket.getTotalEcoTaxe() > 0){
  		          var span,text,text2,text3;
  		    			text = document.createTextNode("Dont ");
  		    			ecoDiv[i].appendChild(text);
  		    			span = document.createElement("span");
  		    			span.className = "nbrEcoPartTotal";
  		    		  text2 = document.createTextNode(this._amountToString(basket.getTotalEcoTaxe()/100));
  		    			span.appendChild(text2);
  		    			ecoDiv[i].appendChild(span);
  		    			text3 = document.createTextNode(" � d'Eco part.");
  		    			ecoDiv[i].appendChild(text3);
  		       }
  			}
  		}
  	}
	}
	
	this._updateNbArticles = function(basket) {
	  if (eval(basket)){ 
  		var nbArticlesTicketCaisse = document.getElementsByName("nbArticles");
  		var nbArticlesHeader = document.getElementById("nbArticlesHeader");
  		
  		var nbArt =0;

  		if(basket.shoppingCart.length != null){
  			nbArt =  this.totalBasket;
  			//alert(basket.shoppingCart.length  + " >>>> " + this.totalBasket);
  		}  		

  
  		if(nbArticlesTicketCaisse!=null) {
  			for (var i = 0 ; i < nbArticlesTicketCaisse.length ; i++){
  		  		if(nbArt == 1 || nbArt == 0){
  		  				if (document.getElementById("basketLineNbArticle") != null){
  		  					var elt = document.getElementById("basketLineNbArticle");
  		  					elt.removeChild(elt.firstChild);
  		  					var text = document.createTextNode(nbArt+" article");
  		  					elt.appendChild(text);
  		  				}
  		    			nbArticlesTicketCaisse[i].firstChild.data = nbArt+" article";
  		  		}else{
  		    			nbArticlesTicketCaisse[i].firstChild.data = nbArt + " articles";
  		  				if (document.getElementById("basketLineNbArticle") != null){
  		  					var elt = document.getElementById("basketLineNbArticle");
  		  					elt.removeChild(elt.firstChild);
  		  					var text = document.createTextNode(nbArt + " articles");
  		  					elt.appendChild(text);
  		  				}
  		  		}
  			}
  		}
  		
  		if(nbArticlesHeader!=null) 
  			   nbArticlesHeader.firstChild.data =  nbArt;
  
  		// sendToFR("basket_articleNumber", nbArt);
  	}
	}


this.drawBasket = function(basket) {
	if (eval(basket)){
  	var basketTableAll = document.getElementsByName("contentTicketCaisse");
  	var basketTable ; //document.getElementById("contentTicketCaisse");
  	var div,div2,p,a,span,text,strong,small,img,input,br,basketItem,divPanier;
  	this.totalBasket = 0;
  		//alert(basketTableAll);
  	if (basketTableAll != null){
  		//alert(basketTableAll.length);
  		clearBasket(basket);
  		//alert('Test atos sur le panier :'+basketTableAll.length);
  		for (var nbB=0 ; nbB < basketTableAll.length ; nbB++) {
  			basketTable = basketTableAll[nbB];
  			//debut contruction du basketTable 
  			if (basketTable != null){
  				//On efface le panier
  				if (eval(basket) && basket.shoppingCart.length !=0){
					this.totalBasket=0;
  					for(var i=basket.shoppingCart.length-1 ; i>=0 ; i--) {
  						basketItem = basket.shoppingCart[i];
  				      	div = document.createElement("div");
  				      	if(i==basket.shoppingCart.length-1)
  						   div.className = "prodTicket latestAdded";
  						else
  						   div.className = "prodTicket";
  							 
  						//1er p
  						p = document.createElement("p");
  						p.className = "linkRetirePanier";
  						a = document.createElement("a");
  						a.setAttribute("id", "RemoveTicket1");
  						//a.className = "linkRemovePdt";
  						a.setAttribute("href", "javascript:clickRemovePdt2("+i+");");
  						span = document.createElement("span");
  						text = document.createTextNode("Retirer du panier");
  						span.appendChild(text);
  						a.appendChild(span);
  						p.appendChild(a);
  						div.appendChild(p);
  							
  								
  						//2eme p
  						p = document.createElement("p");
  						p.className = "descProd";
  						a = document.createElement("a");
  						a.setAttribute("href", "/achat4/"+basketItem.cug);
  			      		strong = document.createElement("strong");
  						text = document.createTextNode(basketItem.marque);
  						strong.appendChild(text);
  						a.appendChild(strong);
  						p.appendChild(a);


  					  var reg=new RegExp("(&euro;)", "g");
  				    var kk = basketItem.denom_commerciale.replace(reg,"�");	
  				
  				
  						a = document.createElement("a");
  						a.setAttribute("href", "/achat4/"+basketItem.cug);	
  		    		  	text = document.createTextNode(" "+basketItem.ref_fournisseur.replace(reg,"�"));
  						a.appendChild(text);
  						p.appendChild(a);
  						br = document.createElement("br");
  						p.appendChild(br);
  						text = document.createTextNode(basketItem.denom_commerciale.replace(reg,"�"));
  						p.appendChild(text);
  						div.appendChild(p);
  							
  								
  						//sous div
  						div2 = document.createElement("div");
  						div2.className = "quantityProd";
  						
  						p = document.createElement("p");
  						p.className = "qtyBlocEnhanced";
  				    input = document.createElement("input");
  				    input.className = "inputQuantity";
  						input.setAttribute("value", basketItem.qte);
						//alert(basketItem.denom_commerciale + " "+ basketItem.qte+" elements");
						this.totalBasket+=basketItem.qte;
						//alert("totalBasket="+this.totalBasket);
						input.setAttribute("id", "qteProdTicket"+i);
						var monName = ""+i;
  						input.setAttribute("name",monName);
              input.onblur= function(){ ctrl_field_numerique_byInputs(monName,basketItem.qte);basket._setShoppingCartQuantity(this.name,this.value); };
		var res = new Object();
		res = getBrowserInfos();
	      if (!res["isFirefoxBrowser"]){
	      	input.onkeypress=function(){if (event.keyCode==13) return false;};
	      }else{
                ajouteEvent(input,"keypress",ctrlTouche,false);
		}
  						//ajouteEvent(input,"blur",actionSetQte,false);	
  						//ajouteEvent(input,"keypress",ctrlTouche,false);	
              p.appendChild(input);
  				    

  						a = document.createElement("a");
  						a.className = "btPlusPdt";
  						a.setAttribute("href", "javascript:basket.incrementProduct("+i+");");
  				  		img = document.createElement("img");
  				  		img.setAttribute("alt", "plus");
  						img.setAttribute("src", "/img/common/signaletique/bt_plus2.gif");
  						a.appendChild(img);
  				  		p.appendChild(a);
  				      	a = document.createElement("a");
  						a.className = "btMoinsPdt";
  				  		a.setAttribute("href", "javascript:basket.decrementProduct(this, "+i+");"); // surcharge
  				  		img = document.createElement("img");
  				  		img.setAttribute("alt", "moins");
  						img.setAttribute("src", "/img/common/signaletique/bt_moins2.gif");
  						a.appendChild(img);
  				  		p.appendChild(a);
  				  		div2.appendChild(p);
  				  		
  				  		//p = document.createElement("p");
  						//	p.className = "prodPrixUnite";
  						//	text = document.createTextNode("X "+this._amountToString(eval(basketItem.prixProduit)/100.00)+ " �");//<fmt:formatNumber value='${(itemListeProduit.priceObj.prixProduit)/100}' pattern="0.00"/>
  						//	p.appendChild(text);
  				      	//div2.appendChild(p);
  				  		
  				  		p = document.createElement("p");
  						p.className = "totalProd";
  						//D�but small
  						small = document.createElement("small");
  						text = document.createTextNode("X");
  						small.appendChild(text);
  						p.appendChild(small);
  						
  						text = document.createTextNode(this._amountToString(eval(basketItem.prixProduit)/100.00)+ " �");//<fmt:formatNumber value='${(itemListeProduit.priceObj.prixProduit)/100}' pattern="0.00"/>' +
  						p.appendChild(text);
  						//Fin small
  					  	strong = document.createElement("strong");
  					  	strong.className = "totalPricePdt";
  						text = document.createTextNode(" = "+this._amountToString(basketItem.qte * eval(basketItem.prixProduit)/100.00));
  						strong.appendChild(text);
  						//span = document.createElement("span");
  							
  						//text = document.createTextNode(this._amountToString(basketItem.qte * eval(basketItem.prixProduit)/100.00));//prix_total_produit 
  						//span.appendChild(text);
  			      		//strong.appendChild(span);
  			      		text = document.createTextNode(" �");
  						strong.appendChild(text);
  						p.appendChild(strong);
  						div2.appendChild(p);
  							
  							
  						if(basketItem.ecoTaxe > 0){
  				  			p = document.createElement("p");
  				  			p.className = "ecoPartProd";
  				  			text = document.createTextNode("+ Eco part. "+this._amountToString(basketItem.qte*(eval(basketItem.prixProduit)/100.00 - eval(basketItem.ecoTaxe)/100.00))+" � + ");//prix_total_produit+total_eco_part
  				  			text = document.createTextNode("Soit "+this._amountToString(basketItem.qte*(eval(basketItem.prixProduit)/100.00 - eval(basketItem.ecoTaxe)/100.00))+" � + "+this._amountToString(basketItem.qte*eval(basketItem.ecoTaxe)/100.00) +" � d'�co part.");//prix_total_produit+total_eco_part
  				  			p.appendChild(text);
  				  			//span = document.createElement("span");
  				  			//span.className = "nbrEcoPart";
  				  			//text = document.createTextNode(this._amountToString(basketItem.qte*eval(basketItem.ecoTaxe)/100.00) +" � d'�co part.");//<fmt:formatNumber value='${itemListeProduit.ecoTaxe/100}' pattern='0.00'/> 
  				  			//span.appendChild(text);
  				        	//p.appendChild(span);
  				        	//p.appendChild(text);
  				  			div2.appendChild(p);
  			     		}
  				  		div.appendChild(div2);
  				  		basketTable.appendChild(div);
  					}
  				}
  				this._updateNbArticles(basket);
  				this._updateTotalAmount(basket);
  			}
  			//fin contruction du basketTable 
  		}
  	}
  }
}
  
  
  
		this._amountToString = function(valeur) {
    	var val = Math.floor(valeur);
    	var decimalPart = Math.round(valeur * 100 - val * 100);
    	var val_format=String(val);
    	var nb=val_format.length;
    	for (var i=1;i<4;i++) {
    		if (val>=Math.pow(10,(3*i))) {
    			val_format=val_format.substring(0,nb-(3*i))+' '+val_format.substring(nb-(3*i));
    		}
    	}
    	if(decimalPart > 0){
          if(decimalPart >= 100) {
      			val += decimalPart / 100;
      			decimalPart %= 100;
      		}
      		val_format += ',';
      		if(decimalPart < 10)
      			val_format += '0';
      		val_format += String(decimalPart);
      }
    	if (parseFloat(valeur)<0) {val_format=" "+val_format;}
    	return val_format;
    }
}

function sendToFR(parametre, valeur) {
  // Une exception "parse exception" est lev�e parce que la
  // page sessionSync.jsp n'est pas capable de g�rer et renvoyer
  // une s�rialisation JSON attendu par cet objet.
  /*
  try {
     new JSONRpcClient("/session/sessionSync.jsp?F_ENV=EM&PREF=0&"+parametre+"="+valeur);
  } catch(e) {
    // ignore
  }*/

}

function ajouteEvent(objet, typeEvent, nomFunction, typePropagation){
  if (objet.addEventListener) {
    objet.addEventListener(typeEvent, nomFunction, typePropagation);
  } else if (objet.attachEvent) {
    objet.attachEvent('on' + typeEvent, nomFunction);
  }
}
function actionSetQte(event){
  //basket._setShoppingCartQuantity(numeroItem,this.value);
}
