var carrito = {
	items: {},
	dom: {},
	request: false,
	response: false,
	fx: false,
	disabled: false,
	initialized: false,

	init: function(){
		if(!this.initialized){
			this.initialized = true;
			this.items = cartItems;
			this.request = new Request({
				url:'/carrito.ajax',
				onSuccess: this.onSuccess.bind(this),
				onFailure: onError
			});
			this.dom = {
				cart:$('miniCart'),
				items:$('cartItems')
			};
			this.dom.items.removeClass('hidden');
			this.dom.counter = this.dom.cart.getFirst().getLast();
			this.dom.link = this.dom.cart.getFirst().getNext();
			this.dom.cart.addEvents({
				'mouseenter':function(){$clear(this._autoHide);}.bind(this),
				'mouseleave':this.autoHide.bind(this,[500])
			}).getFirst().getFirst().addEvent('mouseenter',this.show.bind(this));
			this.parseItems();
			//add links
			$$('.addCart').each(function(el){
				el.addEvent('click',this.addItem.bind(this,[el.className.split(' ')[1],1,false,true]));
			},this);
			
			if(!this.noFx){
				this.fx = new Fx.Slide(this.dom.items,{wait:true,duration:400}).hide();
				this.fx.hide();
			}else{
				this.dom.items.addClass('hidden');
			}
		}
	},

	addItem: function(id,cantidad,replace,synchronize){
		cantidad = cantidad.toInt();
		if(this.items['i'+id]){
			if(replace) {
				this.items['i'+id] = cantidad;
			}else{
				this.items['i'+id] += cantidad;
			}
			if(cantidad==0){
				delete(this.items['i'+id]);
			}
		}else{
			this.items['i'+id] = cantidad;
		}
		if(synchronize){
			this.synchronize();
		}
	},

	removeItem: function(id,synchronize){
		delete(this.items['i'+id]);
		if(synchronize){
			this.synchronize();
		}
	},
	
	removeItems: function(ids){
		for (i=0;i<ids.length;i++){
			delete(this.items['i'+ids[i]]);
		}
		this.synchronize();
	},

	empty: function(){
		if(confirm(_lng.carrito.empty)){
			this.items={};
			this.synchronize();
		}
	},

	onSuccess: function(){
		this.onSynchronize.delay(400,this);
	},

	synchronize: function(){
		$clear(this._autoHide);
		loading.show();
		if(this.fx) this.fx.hide();
		this.request.options.data='action=synchronize&data='+encodeURIComponent(JSON.encode(this.items));
		this.request.send();
	},

	onSynchronize: function(){
		loading.set(_lng.carrito.updated,'success');
		this.update.delay(800,this,[this.request.response.text]);
	},

	update: function(response){
		this.dom.items.empty().setHTML(response);

		//
		var firstChild = this.dom.items.getFirst();
		this.response = JSON.decode(firstChild.innerHTML);
		firstChild.remove();
		this.items = {};
		for(var i in this.response){
			this.items[i] = this.response[i][0];
		}

		var cant = this.count();
		this.dom.counter.setHTML('('+cant+')');
		if(cant>0){
			this.dom.link.className = '';
		}else{
			this.dom.link.className = 'hidden';
		}
		this.parseItems();

		if(this.onUpdate){
			this.onUpdate();
		}else{
			loading.hide();
			if(cant>0){
				this.show();
				this.autoHide(2000);
			}else{
				this.hide();
			}
		}
	},

	parseItems: function(){
		this.dom.items.getElements('span').each(function(el){
			el.removeEvent('click').addEvent('click',this.removeItem.bind(this,[el.className,true]));
		},this);
		var emptyButton = this.dom.items.getElement('em');
		if(emptyButton){
			emptyButton.addEvent('click',this.empty.bind(this));
		}
	},

	count: function(){
		var cant = 0;
		for(var i in this.items){
			cant += this.items[i];
		}
		return cant;
	},

	autoHide: function(delay){
		if(!this.disabled && this.fx){
			this._autoHide = this.fx.slideOut.delay(delay,this.fx);
		}
	},

	hide: function(){
		$clear(this._autoHide);
		if(!this.disabled && this.fx){
			this.fx.slideOut();
		}
	},

	show: function(){
		$clear(this._autoHide);
		if(!this.disabled && this.fx){
			this.fx.slideIn();
		}
	},

	toggleView: function(){
		if(!this.disabled && this.fx){
			if(this.fx.open){
				this.hide();
			}else{
				this.show();
			}
		}
	},

	total: function(){
		var total=0;
		if(this.response){
			for(var i in this.response){
				total += this.response[i][0]*this.response[i][1];
			}
		}
		return total;
	}
};