

	var Basket = Class.create();
	Basket.prototype = {

		initialize:function(id)
		{
			this.articlesWrapper = $(id);
			this.articlesCollection = function()
			{
				return this.articlesWrapper.getElementsByClassName("article");	
			};
			
			this.articlePrefixId = "art";
			
			if(!this.articlesWrapper)
			{
				alert("Error, missing articles wrapper !");
				return;
			}

			this.options = Object.extend({
				//-> webServiceURL
				registerItemURL:"webservices/registerItem.php",
				unRegisterItemURL:"webservices/unRegisterItem.php",
				
				//-> callBacks
				onRegisterItem:Prototype.empyFunction,
				onUnRegisterItem:Prototype.empyFunction,
				
				articleDisplayModel:[
					{data:"name", tag:"div", cssclass:"name"},
					{data:"price", tag:"div", cssclass:"price"}
				],
				bScroll:false,
				loadingIndicator:null
			}, arguments[1] || {});
			
						
			if(this.options.bScroll)
			{
				this.basketScroller = new Scroller(this.articlesWrapper);
				this.articlesWrapper = this.basketScroller.innerBox;
			}

	
		},
		
		getArticlesInnerHTML:function()
		{
			alert(this.articlesWrapper.innerHTML)
		},
		
		/* //-> add article */
		addItem:function(data)
		{
			//alert("addItem. " + data.sizeId);
			/*
			<div class="article last">
				<a href="#" class="trash">x</a>
				<span class="name">the wall</span>
				<span class="price">50&#8364;</span>
				<span class="color">Couleur noir</span>
				<span class="size">Taille M</span>
			</div>
			*/

			var newArticle = new Element("div", {id:this.articlePrefixId + data.id, className:"article", style:"display:none;"});
			this.articlesWrapper.appendChild(newArticle);
			
			//-> delete button
			var deleteButton = new Element("a", {href:"javascript:void(0)", className:"trash"});
			newArticle.appendChild(deleteButton);
			deleteButton.update("");
			deleteButton.observe("click", function(e){
				Event.element(e).blur();
				//alert("deleteButton. " + data.sizeId);
				this.unRegisterItem(newArticle, data);
				
			}.bind(this));
			
			$A(this.options.articleDisplayModel).each(function(column, index){
				/* for(property in column) alert(property + " = " + column[property]) */
				var node = new Element(column.tag, {className:column.cssclass});
				node.update((column.strPrefix?column.strPrefix:"") + eval('data.'+column.data) + (column.strSuffix?column.strSuffix:""))
				newArticle.appendChild(node);
			});
			
			var index = this.articlesCollection().length == 1?0:this.articlesCollection().length - 2;
			this.articlesCollection()[index].removeClassName("last");
			newArticle.addClassName("last");
			
			new Effect.Appear(newArticle, {duration:0, afterFinish:function(){
				if(this.options.bScroll)
				{
					//-> update scroller
					this.basketScroller.resetScrollbar();
					//alert(data.price + " _ " +  parseInt(data.price, 10))
					this.updateTotal(data.price);
				}
			}.bind(this)});
			
		},
				
		registerItem:function(data)
		{
			//alert("registerItem. " + data.sizeId);
			//-> construct parameters string
			var params = "";
			var count = 0;
			for(property in data)
			{
				params = params + (count!=0?"&":"") + property + "=" + data[property];
				count = count + 1;
			}

			if(this.options.registerItemURL != "" && params != "")
			{
				this.webServiceCaller({
					url:this.options.registerItemURL,
					method:"get",
					parameters:"action=add&"+params,
					onLoading:Prototype.emptyFunction,
					onComplete:function(transport, json){
						var response = transport.responseText;
						
						if(this.options.loadingIndicator) this.options.loadingIndicator.desactivate(); 
						  
						if(response != "KO")
						{
							this.addItem(data);
							//-> eval the onAddEvent function
							eval(this.options.onRegisterItem(this));
						}
						else
						{
							alert("Mise au panier impossible. Une erreur est survenue.");
						}
					}.bind(this)
				});
			}
			
			else
			{
				alert("Données à insérer ou paramètres du web service incorrectes [registerItem]");
			}
			
		},
		
		bindItem:function(data)
		{

			//-> construct parameters string
			var params = "";
			var count = 0;
			for(property in data)
			{
				params = params + (count!=0?"&":"") + property + "=" + data[property];
				count = count + 1;
			}
			this.addItem(data);
			/*
			if(this.options.registerItemURL != "" && params != "")
			{
				this.webServiceCaller({
					url:this.options.registerItemURL,
					method:"get",
					parameters:"action=add&"+params,
					onLoading:Prototype.emptyFunction,
					onComplete:function(transport, json){
						var response = transport.responseText;
	
						if(this.options.loadingIndicator) this.options.loadingIndicator.desactivate(); 
						  
						if(response != "KO")
						{
							this.addItem(data);
							//-> eval the onAddEvent function
							eval(this.options.onRegisterItem(this));
						}
						else
						{
							alert("Mise au panier impossible. Une erreur est survenue.");
						}
					}.bind(this)
				});
			}
			
			else
			{
				alert("Données à insérer ou paramètres du web service incorrectes [registerItem]");
			}*/
			
		},
		
		bindTbItem:function(data)
		{
			for(i=0; i<data.length; i++)
			{
				this.addItem(data[i]);
			}
		},
		
	
		/* //-> remove article from DOM */
		removeItem:function(article)
		{
			var wasLastArticle = article.hasClassName("last")?true:false;

			new Effect.Fade(article, {duration:0, afterFinish:function(){
				if(this.options.bScroll)
				{
					var priceToSubstract = parseFloat(article.getElementsByClassName("price")[0].innerHTML);
					article.remove();
					
					if(wasLastArticle && this.articlesCollection().length > 0)
					{
						this.articlesCollection()[this.articlesCollection().length - 1].addClassName("last");
					}
					
					//-> update scroller
					this.basketScroller.resetScrollbar();
					this.updateTotal(-1 * priceToSubstract);

				}
			}.bind(this)});
			
			


		},
		
		/* //-> remove article from DataBase */
		unRegisterItem:function(article, data)
		{
			
			var articleId = "&articleId=" + data.id;
			var sizeId = "&sizeId=" + data.sizeId;
			

			
			if(this.options.unRegisterItemURL != "" && articleId != "")
			{
				this.webServiceCaller({
					url:this.options.unRegisterItemURL,
					method:"get",
					parameters:"action=remove" + articleId + sizeId,
					onLoading:Prototype.emptyFunction,
					onComplete:function(transport, json){
						var response = transport.responseText;
	
						if(this.options.loadingIndicator) this.options.loadingIndicator.desactivate(); 
						  
						if(response != "KO")
						{
							this.removeItem(article)
							//-> eval the onAddEvent function
							eval(this.options.onRegisterItem(this));
						}
						else
						{
							alert("Suppression impossible. Une erreur est survenue.");
						}
					}.bind(this)
				});
			}
			
			else
			{
				alert("Données à supprimer ou paramètres du web service incorrectes [unRegisterItem]");
			}
			
		},
		
		updateTotal:function(nPrice)
		{
			var totalNode = $(document.getElementById("total").getElementsByTagName("span".toUpperCase())[0]);
			totalNode.update(parseInt(((parseFloat(totalNode.innerHTML) + parseFloat(nPrice)) * 100)) / 100);
		},

		webServiceCaller:function()
		{
			var obj = arguments[0];
			var randomNum = new Date().getTime();
			
			var request = new Ajax.Request(obj.url+"?"+"datetime="+randomNum, {
				method:		obj.method, 
				parameters:	obj.parameters, 
				onLoading:	obj.onLoading,
				onComplete:	obj.onComplete,
				onSuccess:	obj.onSuccess
			});
		}

	
	}
	
