// 
//  drawer.js
//  Le tiroir en bas de page qui permet de comparer des mobiles.
//  
//  Created by Ned Baldessin on 2008-09-09.
//  Copyright 2008 Ned Baldessin. All rights reserved.
// 
// 
// 
//  Description
//  Sur certaines pages (page liste mobile, page produit, etc), l’utilisateur peut ajouter
//  des mobiles dans un tiroir comparateur qui apparaît en bas de page.
//  
//  En raison du faible support des standards du web par Internet Explorer, il y a trois
//  différentes versions de ce module.
//  	— version IE6: pas de tiroir, pas de drag’n’drop, feedback par lightbox ;
//  	— version IE7: tiroir, mais pas de drag’n’drop ;
//  	— version standard: tiroir, drag’n’drop.
//  
//  Le backend n’a pas à s’occuper de conserver les mobiles sélectionnés, ils sont
//  gérés par le JS via un cookie.
//  Lors du renvoi sur l’URL du comparateur, ce module va envoyer via une requète GET
//  un tableau des mobiles sélectionnés.
//  Exemple: /comparateur.phpl?mobiles[]=mobile-id-1&mobiles[]=mobile-id-2&mobiles[]=mobile-id-3 ...
//  où mobile-id-1, mobile-id-2 et mobile-id-3 sont les ID uniques des mobiles.
//  
//  Directives d’implémentation
//  Les boutons "Comparer" doivent avoir un attribut "rel" qui pointe vers l’id (DOM) de l’image
//  du mobile à ajouter. Le contenu de cet attribut sera ce qui sera renvoyé sur l’URL du comparateur.
//  Dans les templates fournies, j’ai utilisé "mobile-id-xxx" (où xxx est un nombre unique).
//  
//  Pour ajouter le tiroir sur une page, il suffit de charger drawer.js dans le <head>, comme dans
//  les exemples fournis. Il n’y de plus à faire.
//  
//  Options
//  	— Il faut modifier l’URL du comparateur à deux endroits :
//  		1. dans la fonction exit_to_comparator() pour IE6 ;
//  		2. lors de l’instanciation pour les autres navigateurs, par exemple :
//  		   drawer = new Drawer({comparator_url:'comparateur.php'})


if (Prototype.Browser.IE && parseInt(navigator.appVersion.match( /msie (\d+)/i )[1]) == 6) {

	// ======================
	// = START IE 6 VERSION =
	// ======================
	// For IE6, we dumb down the whole widget: 
	// when a user clicks a "Comparer" button, we display a lightbox.
	
	// Initialization stuff.
	document.write('<script type="text/javascript" src="/js/cookiejar.js "><\/script>');
	document.write('<script type="text/javascript" src="/js/facebox.js "><\/script>');
	document.write('<link rel="stylesheet" href="/css/facebox.css" type="text/css" media="screen">');
	
	var cookie_jar;
	function add_to_session_store(button) {
	var mob_id = button.getAttribute('rel');
	
		// Store the mobile for later.
		var session_mobs = cookie_jar.get('vm_drawer');
		    if(null == session_mobs) {
			    session_mobs = [];
		    }
		    session_mobs.push(mob_id);
		  //alert(session_mobs);
		    cookie_jar.put('vm_drawer', session_mobs);
		    facebox.facebox.hide();
		    facebox.loading();
		    facebox.reveal('<b>Le mobile a été ajouté à votre comparateur.</b><br><br><a href="javascript:exit_to_comparator()">Accéder au comparateur <img src="/images/imgsite/right-arrows.png"></a>', null);
	}
	
	function exit_to_comparator() {
	
	    toto = cookie_jar.get('vm_drawer');
	    //facebox.reveal(''+toto+'');
	   // window.location = 'index.php?currentPage=compare&'+Object.toQueryString({'mobiles[]':cookie_jar.get('vm_drawer')});
	}	
	
	
	// Attach to all the "Comparer" buttons.
	document.observe('dom:loaded', function(){
		
		cookie_jar = new CookieJar({expires:3600*24*30*12, path: '/'});
		
		$$('a.compare').each(function(el){
			Event.observe(el, 'click', function(ev){
				Event.stop(ev);
				add_to_session_store(el);
			});
		});
		
		
		// Le gros bouton "Comparer" sur la page produit.
		if ($('comparer') && $('comparer').getAttribute('rel')) {
			$('comparer').observe('click', function(ev){
				Event.stop(ev);
				add_to_session_store($('comparer'));
			})
		}

		// Les petits boutons "Comparer" sur les "Mobiles similaires", dans la colone de droite
		// sur la page produit.
		$$('a.bt-comparer-small[rel]').each(function(el){
			Event.observe(el, 'click', function(ev){
				Event.stop(ev);
				add_to_session_store(el);
			});
		});
		
		
		
	})
	

	// ====================
	// = END IE 6 VERSION =
	// ====================

} else {


	// =============================
	// = IE7 AND STANDARD VERSIONS =
	// =============================


	//  Monkey patching prototype.js.
	//  Make the droppable work when the target is position:fixed.
	Position.withinIncludingScrolloffsets = function(element, x, y) {
	  var offsetcache = Element.cumulativeScrollOffset(element);

	  this.xcomp = x + offsetcache[0] - this.deltaX;
	  this.ycomp = y + offsetcache[1] - this.deltaY - document.viewport.getScrollOffsets()[1];
	  this.offset = Element.cumulativeOffset(element);

	  return (this.ycomp >= this.offset[1] &&
	          this.ycomp <  this.offset[1] + element.offsetHeight &&
	          this.xcomp >= this.offset[0] &&
	          this.xcomp <  this.offset[0] + element.offsetWidth);
	}
	Position.includeScrollOffsets = true;

	// We use the CookieJar lib to store the added mobiles in a cookie,
	// so we don't need a backend session store for the drawer.
	document.write('<script type="text/javascript" src="/js/cookiejar.js "><\/script>');

	//var drawer = {};

	var Drawer = Class.create({
		initialize: function() {
			this.current_state = 'collapsed';
			this.available_slots = [true, true, true, true, true];
			this.mobiles_in_drawer_count = 0;
		
			this.bg_drop_zone = Prototype.Browser.IE ? '/images/imgsite/drawer/drop-zone-ie.png' : '/images/imgsite/drawer/drop-zone.png';
		
			//this.isIE6 = (Prototype.Browser.IE && parseInt(navigator.appVersion.match( /msie (\d+)/i )[1]) == 6) ? true : false;	
		
			this.options = Object.extend({

				comparator_url: '/comparateur'
				
			}, arguments[0] || {});
		
		
			// Inject the template for the object into the page.
			$('wrapper').insert('<div id="drawer-container" class="collapsed">\
				<div id="drawer"> \
					<div id="drawer-tab"> \
						<div id="handle"> \
							<span id="arrow1" class="replaced arrow">&#x2193;</span> \
							<span id="drawer-count"></span> \
							<span id="arrow2" class="replaced arrow">&#x2193;</span> \
						</div> \
						<span id="close" class="replaced">Fermer le drawer</span> \
					</div> \
					<div id="compared-content"> \
						<div class="drop-zone state-normal" slot="0"></div> \
						<div class="drop-zone state-normal" slot="1"></div> \
						<div class="drop-zone state-normal" slot="2"></div> \
						<div class="drop-zone state-normal" slot="3"></div> \
						<div class="drop-zone state-normal" slot="4"></div> \
						<a id="empty-and-close" href="#">Vider le comparateur</a> \
					</div> \
					<a id="button-compare" class="replaced" href="#">Comparer</a> \
				</div>\
			</div>');
			this.container = $('drawer-container');
		
			// Fix the fact that #main is overflow:auto (so when dragging mobiles out of it creates scrollbars)
			$('main').insert(new Element('div', {'class':'drawer-clear-fix'}));
			$('main').setStyle({overflow:'visible'});
		
		
			$('drawer-tab').observe('click', this.toggle_drawer.bindAsEventListener(this));
		
			//$('button-compare').observe('click', this.exit_to_comparator.bindAsEventListener(this));
		
		
			// Add the mobiles for this session.
			this.cookie_jar = new CookieJar({expires:3600*24*30*12, path: '/'});
			if (this.cookie_jar.get('vm_drawer')) {
				// We have stored mobiles from a previous session.
				//console.log(this.cookie_jar.get('vm_drawer').toJSON());
				var buf = this.cookie_jar.get('vm_drawer');
				for (var i=0; i < 5; i++) {
					dz = this.container.select('.drop-zone')[i];
					if (null != buf[i]) {
						dz.setStyle({backgroundImage:'none'});
						var im = new Element('img', {src: buf[i].src})
						im.setStyle({height:'175px', width:'102px'});
						dz.appendChild(im);
						// And add the 'delete this' button.
						var a = new Element('a', {href:'#'}).update('<img src=/images/imgsite/drawer/delete-mobile.png>');
						var del_el = dz.appendChild(a);

						// Add a callback to delete the added mobile.
						Event.observe(del_el, 'click', this.remove_mobile_from_drawer.bindAsEventListener(this));

						this.mobiles_in_drawer_count++;
					
						$('empty-and-close').show();

						this.available_slots[dz.getAttribute('slot')] = false;
					}
				};

				this.update_mobile_counter();
			
			} else {
				// Initializing the cookie store.
				this.cookie_jar.put('vm_drawer', [null, null, null, null, null]);
			};
		
			$('empty-and-close').observe('click', this.empty_drawer.bindAsEventListener(this));
			//$('close').observe('click', this.close_drawer); // No need, it propagates to the tab.
		},
	
	
		store_mobile: function(position, mobile_id, img_src) {
			var buffer = this.cookie_jar.get('vm_drawer');
			buffer[position] = {id: mobile_id, src:img_src};
			this.cookie_jar.put('vm_drawer', buffer);
		},
	
		remove_from_store: function(position) {
			var buffer = this.cookie_jar.get('vm_drawer');
			buffer[position] = null;
			this.cookie_jar.put('vm_drawer', buffer);
		},
	
	
	
		toggle_drawer: function() {
			this.current_state == 'collapsed' ? this.open_drawer() : this.close_drawer();
		},
	
		open_drawer: function() {
			if (this.current_state == 'collapsed') {
				new Effect.Morph(this.container, {style: 'bottom:-30px',
				    duration: 0.4,
				    transition: virgin_spring});
				this.current_state = 'expanded';
			}
		},
	
		close_drawer: function() {
			if (this.current_state == 'expanded') {
				new Effect.Morph(this.container, {style: 'bottom:-302px',
				    duration: 0.4});
				this.current_state = 'collapsed';
			}
		},
	
		compare_button_handler: function(ev) {
		
			if (this.mobiles_in_drawer_count == 5) {
				Event.stop(ev);
				alert('Seulement 5 mobiles peuvent être comparés à la fois.');
				return false;
			}
			
			for(i=0;i<=5;i++) {
				if(this.available_slots[i]== true) {
					var first_available_slot = i;
					break;
				}
			}
			var target_drop_zone = this.container.select('.drop-zone')[i];

			var mob = $(Event.element(ev).getAttribute('rel'));
			
			
			this.Controller_mobile_id_comparator(mob.id, ev);
			
			this.open_drawer();

			target_drop_zone.setStyle({backgroundImage:'none'});
			var copied_mobile = mob.cloneNode(true);
			copied_mobile.setStyle({height:'175px', width:'102px', position:'static', opacity:'1', display:'inline'});
			target_drop_zone.appendChild(copied_mobile);

			// And add the 'delete this' button.
			var a = new Element('a', {href:'#'}).update('<img src=/images/imgsite/drawer/delete-mobile.png>');
			var del_el = target_drop_zone.appendChild(a);

			// Add a callback to delete the added mobile.
			Event.observe(del_el, 'click', this.remove_mobile_from_drawer.bindAsEventListener(this));

			this.mobiles_in_drawer_count++;
			this.update_mobile_counter();
			$('empty-and-close').show();

			this.available_slots[target_drop_zone.getAttribute('slot')] = false;

			this.store_mobile(target_drop_zone.getAttribute('slot'), mob.id, mob.src);
		
			Event.stop(ev);
		},
	
		remove_mobile_from_drawer: function(rem_ev) {
			var dz = Event.element(rem_ev).up().up();
			dz.innerHTML = '';
			dz.setStyle({backgroundImage:'url('+this.bg_drop_zone+')', backgroundPosition:'top left'});
			this.mobiles_in_drawer_count--;
			if(this.mobiles_in_drawer_count == 0) {
				$('empty-and-close').hide();
			}
			this.update_mobile_counter();
			this.available_slots[dz.getAttribute('slot')] = true;
			this.remove_from_store(dz.getAttribute('slot'));
			Event.stop(rem_ev);
		},

		update_mobile_counter: function() {
			if(this.mobiles_in_drawer_count == 0) {
			
				$('drawer-count').innerHTML = '';
				$('compared-content').hide();
				$('drawer-tab').hide();
				$('drawer').hide();
				$('drawer-container').hide();
				
			} else {
			
				$('drawer-count').innerHTML = '('+this.mobiles_in_drawer_count+')';
				$('compared-content').show();
				$('drawer-tab').show();
				$('drawer').show();
				$('drawer-container').show();
				$('button-compare').observe('click', this.exit_to_comparator.bindAsEventListener(this));
			}
		},

		
		// Callback from one of the 5 Droppables.
		drop_mobile_in: function(drag_el, drop_el, ev) {
		      
			this.cookie_jar = new CookieJar({expires:3600*24*30*12, path: '/'});
			
			// Delete any mobile that was already in the drop area.
			drop_el.innerHTML = '';

			// Hide the invitation to drop background image.
			drop_el.setStyle({backgroundImage:'none'});

			// Put a copy of the mobile image in the drop-zone.
			var copied_mobile = drag_el.cloneNode(true);
			
			 var buffer = this.cookie_jar.get('vm_drawer');
			    if (buffer) {
				for (var i=0; i < 5; i++) {
				    if (null != buffer[i]) {
					if(buffer[i].id == copied_mobile.id){
					   drop_el.setStyle({backgroundImage:''});
					   Event.stop(copied_mobile.id);
					    Event.stop(ev);
					}
				    }
				}
			    }
			    
			copied_mobile.setStyle({height:'175px', width:'102px', position:'static', opacity:'1'});
			drop_el.appendChild(copied_mobile);

			// And add the 'delete this' button.
			var a = new Element('a', {href:'#'}).update('<img src=/images/imgsite/drawer/delete-mobile.png>');
			var del_el = drop_el.appendChild(a);

			// Add a callback to delete the added mobile.
			Event.observe(del_el, 'click', drawer.remove_mobile_from_drawer.bindAsEventListener(drawer));
		
			// Don't increment the mobile counter if we are replacing a mobile.
			if (drawer.available_slots[drop_el.getAttribute('slot')] == true) {
				drawer.mobiles_in_drawer_count++;
				drawer.update_mobile_counter();
			}
			$('empty-and-close').show();

			drawer.available_slots[drop_el.getAttribute('slot')] = false;
		
			drawer.store_mobile(drop_el.getAttribute('slot'), copied_mobile.id, copied_mobile.src);
		
			Event.stop(ev);
		},
	
	
		empty_drawer: function(empty_ev) {
			var the_bg = this.bg_drop_zone ;
			$$('.drop-zone').each(function(el){
				el.innerHTML = '';
				el.setStyle({backgroundImage:'url('+the_bg+')', backgroundPosition:'top left'})
			})

			this.mobiles_in_drawer_count = 0;
			this.update_mobile_counter();
			this.available_slots = [true, true, true, true, true];
			this.cookie_jar.put('vm_drawer', [null, null, null, null, null]);
			$('empty-and-close').hide();
			Event.stop(empty_ev);
		},
	
		exit_to_comparator: function(ev) {
			Event.stop(ev);
			var buffer = this.cookie_jar.get('vm_drawer');
           
			if (buffer) {
				// We don't post null slots.
				var v = [];
                for (var i=0; i < 5; i++) {
					if (null != buffer[i]) {
                               
                            v.push(buffer[i].id);
                        
					}else{
                        v.push(',');
                    }
				}
                
                window.location = this.options.comparator_url+'&'+Object.toQueryString({'':v})+'.htm&';
        	} else {
				alert('Ajoutez des mobiles au tiroir pour pouvoir les comparer.');
			}
		},	
			
		Controller_mobile_id_comparator: function(mob, ev) {
		    var buffer = this.cookie_jar.get('vm_drawer');
		    if (buffer) {
			for (var i=0; i < 5; i++) {
			    if (null != buffer[i]) {
				if(buffer[i].id == mob){
				    Event.stop(mob);
				    Event.stop(ev);
				}
			    }
			}
		    }
		},
		
		Drag_Controller_mobile_id_comparator: function(mob) {
		    var buffer = this.cookie_jar.get('vm_drawer');
		    if (buffer) {
			for (var i=0; i < 5; i++) {
			    if (null != buffer[i]) {
				if(buffer[i].id == mob.id){
				    Event.stop(mob.id);
				}
			    }
			}
		    }
		}
		
	});



	document.observe('dom:loaded', function(){
	     // Ici, on peut spécifier une URL pour le comparateur.
		// drawer = new Drawer({comparator_url:'comparateur.php'})
		drawer = new Drawer();
	
		// Les boutons "Comparer" dans les vues en listes de mobiles
		// (c-à-d le Top-5 sur la home, le centre de la page liste mobile,
		// l'onglet Mobiles de la même marque sur la page produit, etc)
		$$('a.compare[rel]').each(function(el){
			Event.observe(el, 'click', drawer.compare_button_handler.bindAsEventListener(drawer));
		});
	
		// Le gros bouton "Comparer" sur la page produit.
		if ($('comparer') && $('comparer').getAttribute('rel')) {
			$('comparer').observe('click', drawer.compare_button_handler.bindAsEventListener(drawer))
		}

		// Les petits boutons "Comparer" sur les "Mobiles similaires", dans la colone de droite
		// sur la page produit.
		$$('a.bt-comparer-small[rel]').each(function(el){
			Event.observe(el, 'click', drawer.compare_button_handler.bindAsEventListener(drawer));
		});
	
		// DRAG'N'DROP
		// Désactivé pour IE7 pour manque de support décent de z-index.
		if(!Prototype.Browser.IE) {
			$$('table.mobile-list tr.pic-row img').each(function(el){
				new Draggable(el, {ghosting: false, revert:true, onStart:drawer.open_drawer.bindAsEventListener(drawer) });
			});
	
			// On désamorce les liens sur les /images si l'utilisateur
			// vient de glisser-déposer un item.
			$$('table.mobile-list tr.pic-row a').each(function(el){
				$(el).observe('click', function(the_click) {
					if (Draggable._dragging[the_click.element()]) the_click.stop(); 
				});
			});
	
			$$('.drop-zone').each(function(el){
				Droppables.add(el, {hoverclass:'state-hover', onDrop:drawer.drop_mobile_in });
			});
		}
	
	})

}


