// Class QuoteRequest
/*	L'objet QuoteRequest représente le panier
	Il contient une liste de produits accessibles via leur id
	Il ne doit y avoir qu'une seule instance (la globale myQuoteRequest)
*/

	// Constructeur
	var QuoteRequest = function(param) {
		this.list = {};
		this.setCount({'count': 0});
	};
	
	// getIdFromClassName
	/* Renvoie l'id du produit en fonction de className */
	QuoteRequest.getIdFromClassName = function(param) {
		var reg = new RegExp('myquoterequest-add-([0-9]+)');
		return reg.exec(param.className)[1];
	};
	
	// updateBull
	/* Met à jour le texte de l'info-bull */
	QuoteRequest.updateBull = function(param) {
		var bull = $('#myquoterequest-table-add-bull-content');
		if (bull) bull.text((param.selected) ? 'Remove from my quote request' : 'Add to my quote request');
	};
	
	// add
	/* Ajoute un produit */
	QuoteRequest.prototype.add = function(param) {
		var query = (param.query !== undefined) ? param.query : true;
		
		var id = param.id;
		
		if (this.list[id]) throw 'Le produit '+id+' existe déjà dans la commande !';
		
		var product = QuoteRequestProduct.getProductById({'id': id});
		
		if (query) {
			if (! product.isEnabled()) return false;	// requête déjà en cours
			product.setEnabled({'enabled': false});
			
			var quoteRequest = this;
			
			_gaq.push(['_trackPageview','add-to-cart-before']);
					
			$.ajax({
				url: '/ajax/quoterequest.php',
				cache: false,
				data: 'action=add&id='+id,
				dataType: 'json',
				success: function(data) {
					if (! data.success) {
						alert('Sorry, a problem has occured ...');
						return false;
					}
					param.query = false;
					quoteRequest.add(param);
					
					_gaq.push(['_trackPageview','add-to-cart-after']);
				},
				complete: function(xhr, status) {
					product.setEnabled({'enabled': true});
				}
			});
		}
		else {
			this.list[id] = product;
			this.setCount({'count': this.getCount()+1});
			this.reloadButtonsHavingID({'id': id});
		}
	};
	
	// addProducts
	/* Ajoute une liste de produits */
	QuoteRequest.prototype.addProducts = function(param) {
		var list = param.list;
		var i;
		for (i in list) this.add({'id': list[i], 'query': false});
	}
	
	// getCount
	/* Renvoie le nombre de produits */
	QuoteRequest.prototype.getCount = function() {
		return this.count;
	};
	
	// getProductById
	/* Renvoie un produit par id */
	QuoteRequest.prototype.getProductById = function(param) {
		var p = this.list[param.id];
		if (p) return p;
		else throw 'Le produit '+id+' n\'est pas dans la commande !';
	};
	
	// hasGot
	/* Renvoie si l'id est dans la commande */
	QuoteRequest.prototype.hasGot = function(param) {
		return (this.list[param.id]) ? true : false;
	};
	
	// initButtons
	/* Initialise les boutons */
	QuoteRequest.prototype.initButtons = function() {
		// myquoterequest-add
		$('.myquoterequest-list-add,.myquoterequest-table-add').each(function() {
			$(this).unbind('click.myquoterequest');
			$(this).bind('click.myquoterequest', function(e) {
				var id = QuoteRequest.getIdFromClassName({'className': $(this).attr('class')});
				
				myQuoteRequest.swapProduct({'id': id});
				e.stopPropagation();	// stopPropagation car à l'intérieur d'un lien
			});
		});
		
		// myquoterequest-table-add
		var bull = $('#myquoterequest-table-add-bull-container');
		if (bull) {
			bull.show();
			bull.css('left', 0);
			bull.css('top', 0);
			var offset = bull.offset();
			
			$('.myquoterequest-table-add').each(function() {
				var button = $(this);
				var id = QuoteRequest.getIdFromClassName({'className': button.attr('class')});
				
				button.unbind('mouseenter.myquoterequest');
				button.bind('mouseenter.myquoterequest', function() {
					bull.show();
					var o = button.offset();
					bull.css('left', o.left-offset.left+12);
					bull.css('top', o.top-offset.top-38);
					QuoteRequest.updateBull({'selected': myQuoteRequest.hasGot({'id': id})});
				});
				button.unbind('mouseleave.myquoterequest');
				button.bind('mouseleave.myquoterequest', function(e) {
					bull.hide();
				});
			});
			
			bull.hide();
		}
		
		this.reload();
	};
	
	// onsubmitHandler
	/* Handler envoi email */
	QuoteRequest.prototype.onsubmitHandler = function(param) {
		var s = 0;
		var n = 0;
		var t = [];
		$('#table-lst-products .myquoterequest-table-add').each(function() {
			if ($(this).hasClass('selected')) s++;
			t.push(QuoteRequest.getIdFromClassName({'className': $(this).attr('class')}));
			n++;
		});
		if (s === 0) { alert('You have to select at least one product !'); return false; }
		if (s < n && ! confirm('Are you sure you want to select '+s+' product'+((s > 1) ? 's' : '')+' on '+n+' possible ?')) return false;
		param.form.products.value = t.join(',');
		return true;
	};
	
	// reload
	/* Initialise l'affichage de tous les boutons */
	QuoteRequest.prototype.reload = function() {
		var quoteRequest = this;
		$('.myquoterequest-table-add').each(function() { quoteRequest.reloadButton({'button': $(this)}); });
		$('.myquoterequest-list-add').each(function() { quoteRequest.reloadButton({'button': $(this)}); });
	};
	
	// reloadButton
	/* Initialise l'affiche d'un bouton */
	QuoteRequest.prototype.reloadButton = function(param) {
		var button = param.button;
		var className = button.attr('class');
		var id = QuoteRequest.getIdFromClassName({'className': className});
		
		var selected;
		try { var product = this.getProductById({'id': id}); selected = true; } catch (e) { var product = QuoteRequestProduct.getProductById({'id': id}); selected = false; }
		
		button[(selected) ? 'addClass' : 'removeClass']('selected');
		if (className.indexOf('-list-') > -1) button.html(((selected) ? 'Remove from' : 'Add to')+'<br />my quote request');
		button.css({opacity: (product.isEnabled()) ? 1 : 0.5});
	};
	
	// reloadButtonsHavingID
	/* Met à jour les boutons d'un id particulier */
	QuoteRequest.prototype.reloadButtonsHavingID = function(param) {
		var id = param.id;
		var quoteRequest = this;
		
		$('.myquoterequest-add-'+id).each(function() { quoteRequest.reloadButton({'button': $(this)}); });
		$('.myquoterequest-list-add.myquoterequest-add-'+id).each(function() { quoteRequest.reloadButton({'button': $(this)}); });
	};
	
	// remove
	/* Supprime un produit de la commande */
	QuoteRequest.prototype.remove = function(param) {
		var query = (param.query !== undefined) ? param.query : true;
		
		var id = param.id;
		
		var product = this.getProductById({'id': id});	// throwable
		
		if (query) {
			if (! product.isEnabled()) return false;	// requête déjà en cours
			product.setEnabled({'enabled': false});
			
			var quoteRequest = this;
			
			$.ajax({
				url: '/ajax/quoterequest.php',
				cache: false,
				data: 'action=remove&id='+id,
				dataType: 'json',
				success: function(data) {
					if (! data.success) {
						alert('Sorry, a problem has occured ...');
						return false;
					}
					param.query = false;
					quoteRequest.remove(param);
				},
				complete: function(xhr, status) {
					product.setEnabled({'enabled': true});
				}
			});
		}
		else {
			this.list[id] = null;
			delete this.list[id];
			this.setCount({'count': this.getCount()-1});
			this.reloadButtonsHavingID({'id': id});
		}
	};
	
	// setCount
	/* Affecte le nombre de produits */
	QuoteRequest.prototype.setCount = function(param) {
		var count = this.getCount();
		var tcount = param.count;
		if (tcount !== count) {
			this.count = tcount;
			$('#myquoterequest-count').text(tcount);
			QuoteRequest.updateBull({'selected': (tcount > count)});
		}
	};
	
	// swapProduct
	/* Ajoute ou retire un produit */
	QuoteRequest.prototype.swapProduct = function(param) {
		var id = param.id;
		try { this.remove({'id': id}); } catch (e) { this.add({'id': id}); }
	};

// Class QuoteRequestProduct

	// Constructeur
	var QuoteRequestProduct = function(param) {
		this.setEnabled({'enabled': true});
		this.setID({'id': param.id});
	};
	
	QuoteRequestProduct.factory = {};
	
	// getProductById
	/* Factory */
	QuoteRequestProduct.getProductById = function(param) {
		var id = param.id;
		var factory = QuoteRequestProduct.factory;
		if (! factory[id]) factory[id] = new QuoteRequestProduct({'id': id});
		return factory[id];
	};
	
	// getID
	/* Renvoie l'id du produit */
	QuoteRequestProduct.prototype.getID = function() {
		return this.id;
	};
	
	// isEnabled
	/* Renvoie si le produit est utilisable */
	QuoteRequestProduct.prototype.isEnabled = function() {
		return this.enabled;
	};
	
	// setEnabled
	/* Affecte si le produit est utilisable */
	QuoteRequestProduct.prototype.setEnabled = function(param) {
		var enabled = param.enabled;
		if (enabled != this.isEnabled()) {
			this.enabled = param.enabled;
			myQuoteRequest.reloadButtonsHavingID({'id': this.getID()});
		}
	};
	
	// setID
	/* Affecte l'id du produit */
	QuoteRequestProduct.prototype.setID = function(param) {
		this.id = param.id;
	};

