/*
 * Gestion des fausses popups
 */

// init namespace (à utiliser pour éviter toute collision)
if(!SOF) {var SOF = {};}

// données pour les scripts de cette page
SOF.datasFakePopups = {
	'animDelay': 30,
	'animSlow': 6,
	'adjust': 28,
	'scrollAmount': 5,
	'limit': 50,
	'timer': null,
	'timer1': null
};
if(!$$DP) {var $$DP = SOF.datasFakePopups;}

// dimensions de la page (viewport, scroll amount et total)
SOF.page = function() {
	var de = document.documentElement;
	return {
		'availableW': window.innerWidth || (de && de.clientWidth) || document.body.clientWidth,
		'availableH': window.innerHeight || (de && de.clientHeight) || document.body.clientHeight,
		'scroll': window.pageYOffset || (de && de.scrollTop) || document.body.scrollTop,
		'total': de.scrollHeight || window.body.scrollHeight
	};
};

// fausses popups
SOF.fakePopups = {
	init: function() {
		// chemin d'accès aux images, suivant le contexte
		$$DP.path = location.href.indexOf('/fh/') > -1 ? '/imagerie/fh/' : '/imagerie/commun/';
		// les éléments ouvrant une popin
		var l = Box.nodes.get('a.ajax');
		for(var i = 0, li; li = l[i]; i++) {
			Box.events.add(li, 'click', function(e) {
				SOF.fakePopups.request(e, this);
			});
		}
		l = null; li = null; // nettoyage
	},
	
	request: function(e, l) {
		if(Box.nodes.get('img', [l])[0]) {
			if($$DM.activeItem) {
				if($$DM.activeItem == l) {
					e.preventDefault();
					return;
				}
				SOF.rollovers.exe($$DM.activeItem, 'off', true);
			}
			$$DM.activeItem = l;
		}
		$$DP.url = Box.nodes.attribute(l, 'href');
		$$DP.scroll = Box.nodes.hasClass(l, 'scroll');
		Box.ajax({
			'type': 'GET',
			'url': $$DP.url,
			'onSuccess': SOF.fakePopups.create
		});
		e.preventDefault();
	},
	
	create: function(d) {
		var verif = Box.nodes.get('#popup-chrome')[0];
		if(verif) {verif.parentNode.removeChild(verif);}
		Box.nodes.addClass(document.body, 'js-popin');
		var insert = '';
		// START NURUN@20080409
		var cls = ' class="hidden';
		if($$DP.scroll) {
			cls += ' scroll';
		} else if(d.indexOf('id="gallery"') > -1) {
			Box.nodes.addClass(document.body, 'gallery');
			cls += ' gallery';
		}
		cls += '"';
		// END NURUN@20080409
		var cut = $$DP.url.lastIndexOf('/');
		var url = $$DP.url.substring(cut + 1);
		url = url.replace(/(_\d+)?\..+/g, '');
		// START NURUN@20080409
		insert += '<div id="popup-chrome"' + cls + '>';
		// END NURUN@20080409
		insert += '<h2>' + SOF[$$L].fakePopups[url] + '</h2>';
		insert += '<div class="close"><a href="#"><img alt="' + SOF[$$L].alt.close + '" src="/px.gif" /></a></div>';
		if($$DP.scroll) {
			insert += '<div id="scroller">';
			insert += '<a href="#" id="scroller-up"><img alt="' + SOF[$$L].alt.scrollUp + '" src="' + $$DP.path + 'scroll_popup_up.gif" /></a>';
			insert += '<a href="#" id="scroller-down"><img alt="' + SOF[$$L].alt.scrollDown + '" src="' + $$DP.path + 'scroll_popup_down.gif" /></a>';
			insert += '<span id="scroller-state"></span>';
			insert += '</div>';	
		}
		insert += '<div id="popup-inner">';
		insert += d.substring(d.indexOf('<div id="popup"'), d.indexOf('</body>'));
		insert += '</div>';
		insert += '</div>';
		Box.nodes.insert(insert, Box.nodes.get('#body')[0], 'after', {
			'tag': '#popup-chrome',
			'click': function(e) {SOF.fakePopups.exe(e);}
		});
		// init du remplacement de formulaire si nécessaire
		if(d.indexOf('<form') > -1 && SOF.niceforms) {SOF.niceforms.init();}
		// récupération des éléments
		$$DP.chrome = Box.nodes.get('#popup-chrome')[0];
		$$DP.popup = Box.nodes.get('#popup')[0];
		SOF.positionAndMove($$DP.chrome);
		// init du scroll si nécessaire
		if($$DP.scroll) {
			$$DP.timer = setTimeout(function() {SOF.fakePopups.scroll();}, 1000); // temps de calcul pour Firefox
			$$DP.mask = Box.nodes.get('#popup-inner')[0];
			$$DP.state = Box.nodes.get('#scroller-state')[0];
			$$DP.up = Box.nodes.get('#scroller-up')[0];
			$$DP.down = Box.nodes.get('#scroller-down')[0];
		}
		// affichage du popup
		Box.nodes.removeClass($$DP.chrome, 'hidden');
		// si galerie flash : nom du fichier contient 'gallery' ou 'flash'
		if((url.indexOf('gallery') > -1)||(url.indexOf('flash') > -1)) {SOF.displayGallery();}
	},
	
	scroll: function() {
		$$DP.timer = null;
		$$DP.popupH = $$DP.popup.scrollHeight;
		$$DP.popup.style.top = '0';
		$$DP.maskH = $$DP.mask.offsetHeight;
		$$DP.stateE = $$DP.maskH - $$DP.adjust;
		// New nurun
		$$DP.stateH = Math.round($$DP.maskH / $$DP.popupH * $$DP.stateE);
		//$$DP.stateH = Math.ceil($$DP.stateE * $$DP.stateE / $$DP.popupH);
		if(($$DP.stateH + $$DP.adjust) > $$DP.maskH || $$DP.popupH <= $$DP.maskH) {$$DP.stateH = $$DP.maskH - $$DP.adjust;}
		$$DP.state.style.top = '0';
		$$DP.state.style.height = $$DP.stateH + 'px';
		//$$DP.stateAmount = Math.floor($$DP.stateE * $$DP.stateE / $$DP.popupH);
		$$DP.amount = $$DP.maskH - Math.ceil($$DP.maskH / $$DP.scrollAmount);
		if($$DP.popupH <= $$DP.maskH) {
			$$DP.noscroll = true;
		} else {
			/*
			Box.events.add($$DP.up, 'click', function(e) {
				SOF.fakePopups.exe(e);
			});
			Box.events.add($$DP.down, 'click', function(e) {
				SOF.fakePopups.exe(e);
			});*/
			// coordonnées maximum pour drag'n'drop
			var maxY = $$DP.stateE - $$DP.stateH;
			// init Drag'n'drop
			Box.drag.init($$DP.state, null, 0, 0, 0, maxY, true);
			$$DP.state.onDrag = function(nx, ny) {SOF.fakePopups.dragMove(ny);};
		}
	},
	
	dragMove: function(ny) {
		var top = Math.round(ny / $$DP.stateE * $$DP.popupH);
		if(top > ($$DP.popupH - $$DP.maskH)) {top = $$DP.popupH - $$DP.maskH;}
		$$DP.popup.style.top = - top + 'px';
	},
	
	recompute: function() {
		$$DP.popupH = $$DP.popup.scrollHeight;
		// New nurun
		$$DP.stateH = Math.round($$DP.maskH / $$DP.popupH * $$DP.stateE);
		//$$DP.stateH = Math.ceil($$DP.stateE * $$DP.stateE / $$DP.popupH);
		if(($$DP.stateH + $$DP.adjust) > $$DP.maskH) {$$DP.stateH = $$DP.maskH - $$DP.adjust;}
		$$DP.state.style.height = $$DP.stateH + 'px';
		$$DP.stateAmount = Math.floor($$DP.stateE * $$DP.stateE / $$DP.popupH);
		$$DP.amount = $$DP.maskH - Math.ceil($$DP.maskH / $$DP.scrollAmount);
		var cur = Math.abs(parseInt($$DP.popup.style.top, 10));
		var verif = $$DP.popupH - $$DP.maskH;
		if(cur > verif) {
			$$DP.popup.style.top = '-' + verif + 'px';
			$$DP.state.style.top = $$DP.stateE - $$DP.stateH + 'px';
		}
	},
	
	exe: function(e) {
		var t = e.target || e.srcElement;
		// cas d'un clic sur une zone pouvant contenir la scrollbar
		if(t.nodeName.toLowerCase() == 'div' && t.id == 'scroller') {
			var c = Box.events.getXY(e).y - (Box.nodes.findPos(t)[1] + SOF.datasFakePopups.adjust / 2),
				top = parseInt($$DP.state.style.top, 10),
				move = c - top < 0 ? top - c : c - top - $$DP.stateH,
				amount = Math.round(move / $$DP.stateE * $$DP.popupH);
			if(c - top > 0) {
				SOF.scrollerFP.startDown($$DP.state, $$DP.stateH, $$DP.stateE, $$DP.popup, $$DP.popupH, $$DP.maskH, amount);
			} else {
				SOF.scrollerFP.startUp($$DP.state, $$DP.stateE, $$DP.popup, $$DP.popupH, $$DP.maskH, amount);
			}
		}
		//fin cas
		while(t.nodeName.toLowerCase() != 'a' && t != $$DP.chrome) {t = t.parentNode;}
		// si en cours d'anim ou pas de scroll, annulation
		if(t == $$DP.up && $$DP.inAnim || t == $$DP.down && $$DP.inAnim) {e.preventDefault(); return;}
		if((t == $$DP.up || t == $$DP.down) && $$DP.noscroll) {e.preventDefault(); return;}
		// traitement du scroll
		if(t == $$DP.up && !$$DP.inAnim) {
			// New nurun
			SOF.scrollerFP.startUp($$DP.state, $$DP.stateE, $$DP.popup, $$DP.popupH, $$DP.maskH, $$DP.amount);
			//SOF.scroller.startUp($$DP.state, $$DP.popup, $$DP.popupH, $$DP.maskH, $$DP.amount);
		} else if(t == $$DP.down && !$$DP.inAnim) {
			SOF.scrollerFP.startDown($$DP.state, $$DP.stateH, $$DP.stateE, $$DP.popup, $$DP.popupH, $$DP.maskH, $$DP.amount);
		// liens de fermeture
		} else if(Box.nodes.hasClass(t.parentNode, 'close')) {
			$$DP.chrome.parentNode.removeChild($$DP.chrome);
			Box.nodes.removeClass(document.body, 'js-popin');
			Box.nodes.removeClass(document.body, 'gallery');

			// modifie pour bug fermeture popup sofitel	
			try{
				if($$DM.activeItem) {SOF.rollovers.exe($$DM.activeItem, 'off', true);}
				$$DM.activeItem = null;
			}
			catch (e){
			}	
			
		// lien d'impression
		} else if(t.href && t.href.indexOf('javascript:') > -1 && t.href.indexOf('javascript:FH') == -1) {
			window.print();
		// nouveau contenu de la pop-in
		} else if(Box.nodes.hasClass(t, 'ajax')) {
			SOF.fakePopups.request(e, t);
		// lien normal dans la pop-in
		} else {
			return;
		}
		try{
			e.preventDefault();
		}
			catch (e){
		}	

		t = null; // nettoyage
	},
	
	closeGallery: function() {
		$$DP.chrome.parentNode.removeChild($$DP.chrome);
		if($$DM.activeItem) {SOF.rollovers.exe($$DM.activeItem, 'off', true);}
		$$DM.activeItem = null;
		Box.nodes.removeClass(document.body, 'gallery');
	}
};

// gestion de la popup favoris
SOF.favoris = {
	init: function() {
		var lk = Box.nodes.get('#bookmark')[0];
		if(lk) {Box.events.add(lk, 'click', SOF.favoris.create);}
		SOF.favoris.implement();
	},
	
	create: function(e) {
		e.preventDefault();
		var insert = '<div id="favoris-chrome">';
		insert += '<h2>' + SOF[$$L].fakePopups.pop_favoris + '</h2>';
		insert += '<div class="close"><a href="#"><img alt="' + SOF[$$L].alt.close + '" src="/px.gif" /></a></div>';
		insert += '<iframe src="' + this.href + '" id="bookmarks" frameborder="0" scrolling="no"></iframe>';
		insert += '</div>';
		Box.nodes.insert(insert, Box.nodes.get('#body')[0], 'after', {
			'tag': '#favoris-chrome',
			'click': function(e) {SOF.favoris.exe(e, 'chrome');}
		});
		$$DP.fav.chrome = Box.nodes.get('#favoris-chrome')[0];
		SOF.positionAndMove($$DP.fav.chrome);
	},
	
	implement: function() {
		$$DP.fav = {};
		$$DP.fav.mask = Box.nodes.get('#favoris')[0];
		$$DP.fav.full = Box.nodes.get('#favoris-inner')[0];
		if(!$$DP.fav.mask || !$$DP.fav.full) {return;}
		Box.nodes.addClass($$DP.fav.mask, 'js');
		var insert = '<div id="scroller">';
		insert += '<a href="#" id="scroller-up"><img alt="' + SOF[$$L].alt.scrollUp + '" src="' + $$DP.path + 'scroll_popup_up.gif" /></a>';
		insert += '<a href="#" id="scroller-down"><img alt="' + SOF[$$L].alt.scrollDown + '" src="' + $$DP.path + 'scroll_popup_down.gif" /></a>';
		insert += '<span id="scroller-state"></span>';
		insert += '</div>';
		Box.nodes.insert(insert, $$DP.fav.mask, 'first', {
			'tag': '#favoris',
			'click': function(e) {SOF.favoris.exe(e);}
		});
		SOF.favoris.scroll();
	},
	
	scroll: function() {
		$$DP.fav.maskH = $$DP.fav.mask.offsetHeight;
		$$DP.fav.full = Box.nodes.get('#favoris-inner')[0];
		$$DP.fav.full.style.top = '0';
		$$DP.fav.fullH = $$DP.fav.full.scrollHeight;
		$$DP.fav.up = Box.nodes.get('#scroller-up')[0];
		$$DP.fav.down = Box.nodes.get('#scroller-down')[0];
		$$DP.fav.state = Box.nodes.get('#scroller-state')[0];
		$$DP.fav.stateE = $$DP.fav.maskH - $$DP.adjust;
		// New nurun
		$$DP.fav.stateH = Math.round($$DP.fav.maskH / $$DP.fav.fullH * $$DP.fav.stateE);
		//$$DP.fav.stateH = Math.ceil($$DP.fav.stateE * $$DP.fav.stateE / $$DP.fav.fullH);
		if(($$DP.fav.stateH + $$DP.adjust) > $$DP.fav.maskH || $$DP.fav.fullH <= $$DP.fav.maskH) {$$DP.fav.stateH = $$DP.fav.maskH - $$DP.adjust;}
		$$DP.fav.state.style.top = '0';
		$$DP.fav.state.style.height = $$DP.fav.stateH + 'px';
		$$DP.fav.stateAmount = Math.floor($$DP.fav.stateE * $$DP.fav.stateE / $$DP.fav.fullH);
		$$DP.fav.amount = $$DP.fav.maskH - Math.ceil($$DP.fav.maskH / $$DP.scrollAmount);
		if($$DP.fav.fullH <= $$DP.fav.maskH) {
			$$DP.fav.noscroll = true;
		} else {
			/*
			Box.events.add($$DP.fav.up, 'click', function(e) {
				SOF.favoris.exe(e);
			});
			Box.events.add($$DP.fav.down, 'click', function(e) {
				SOF.favoris.exe(e);
			});
			*/
			// coordonnées maximum pour drag'n'drop
			var maxY = $$DP.fav.stateE - $$DP.fav.stateH;
			// init Drag'n'drop
			Box.drag.init($$DP.fav.state, null, 0, 0, 0, maxY, true);
			$$DP.fav.state.onDrag = function(nx, ny) {SOF.favoris.dragMove(ny);};
		}
	},
	
	dragMove: function(ny) {
		var top = Math.round(ny / $$DP.fav.stateE * $$DP.fav.fullH);
		if(top > ($$DP.fav.fullH - $$DP.fav.maskH)) {top = $$DP.fav.fullH - $$DP.fav.maskH;}
		$$DP.fav.full.style.top = - top + 'px';
	},
	
	exe: function(e, chrome) {
		var t = e.target || e.srcElement;
		// cas d'un clic sur une zone pouvant contenir la scrollbar
		if(t.nodeName.toLowerCase() == 'div' && t.id == 'scroller') {
			var c = Box.events.getXY(e).y - (Box.nodes.findPos(t)[1] + SOF.datasFakePopups.adjust / 2),
				top = parseInt($$DP.fav.state.style.top, 10),
				move = c - top < 0 ? top - c : c - top - $$DP.fav.stateH,
				amount = Math.round(move / $$DP.fav.stateE * $$DP.fav.fullH);
			if(c - top > 0) {
				SOF.scrollerFP.startDown($$DP.fav.state, $$DP.fav.stateH, $$DP.fav.stateE, $$DP.fav.full, $$DP.fav.fullH, $$DP.fav.maskH, amount);
			} else {
				SOF.scrollerFP.startUp($$DP.fav.state, $$DP.fav.stateE, $$DP.fav.full, $$DP.fav.fullH, $$DP.fav.maskH, amount);
			}
		}
		// fin cas
		while(t.nodeName.toLowerCase() != 'a' && t.nodeName.toLowerCase() != 'div') {t = t.parentNode;}
		if(t.nodeName.toLowerCase() != 'a') {return;}
		if(chrome) {
			e.preventDefault();
			SOF.favoris.close();
			return;
		}
		// si en cours d'anim ou pas de scroll, annulation
		if(t == $$DP.fav.up && $$DP.inAnim || t == $$DP.fav.down && $$DP.inAnim) {e.preventDefault(); return;}
		if((t == $$DP.fav.up || t == $$DP.fav.down) && $$DP.fav.noscroll) {e.preventDefault(); return;}
		// traitement du scroll
		if(t == $$DP.fav.up && !$$DP.inAnim) {
			// New nurun
			SOF.scrollerFP.startUp($$DP.fav.state, $$DP.fav.stateE, $$DP.fav.full, $$DP.fav.fullH, $$DP.fav.maskH, $$DP.fav.amount);
			//SOF.scroller.startUp($$DP.fav.state, $$DP.fav.full, $$DP.fav.fullH, $$DP.fav.maskH, $$DP.fav.amount);
		} else if(t == $$DP.fav.down && !$$DP.inAnim) {
			SOF.scrollerFP.startDown($$DP.fav.state, $$DP.fav.stateH, $$DP.fav.stateE, $$DP.fav.full, $$DP.fav.fullH, $$DP.fav.maskH, $$DP.fav.amount);
		// liens de fermeture
		} else if(Box.nodes.hasClass(t.parentNode, 'close') || Box.nodes.hasClass(t, 'close')) {
			window.top.SOF.favoris.close();
		// autres liens
		} else {
			return;
		}
		e.preventDefault();
		t = null; // nettoyage
	},
	
	close: function() {
		if($$DP.fav.chrome) {$$DP.fav.chrome.parentNode.removeChild($$DP.fav.chrome);}
	}
};

// positionnement et drag'n'drop des popups
SOF.positionAndMove = function(popup) {
	var handle = Box.nodes.get('h2', [popup])[0];
	// positionnement du popup
	var pos = SOF.page();
	if(pos.total < pos.availableH) {pos.total = pos.availableH;}
	var top = parseInt((pos.availableH - popup.offsetHeight) / 2, 10) + pos.scroll;
	var left = parseInt((pos.availableW - popup.offsetWidth) / 2, 10);
	if(top < 0) {top = 0;}
	if(left < 0) {left = 0;}
	popup.style.top = top + 'px';
	popup.style.left = left + 'px';
	// coordonnées maximum pour drag'n'drop
	var minX = 0;
	var maxX = pos.availableW - popup.offsetWidth - 20;
	var minY = 0;
	var maxY = pos.total - popup.offsetHeight;
	// init Drag'n'drop
	Box.drag.init(handle, popup, minX, maxX, minY, maxY);
};

// traitement du scroll
SOF.scrollerFP = {
	startDown: function(b, bH, bE, t, tH, mH, amount) {
		var top = Math.abs(parseInt(t.style.top, 10));
		var to = (top + mH + amount) > tH ? tH - mH : top + amount;
		if(tH - to - mH < $$DP.limit) {to = tH - mH;}
		$$DP.inAnim = true;
		SOF.scrollerFP.tDown(to, t);
		// New nurun
		var scroll = parseInt(b.style.top, 10) + Math.ceil(bE * (to - top) / tH);
		//var scroll = Math.ceil(to / tH * mH);
		if((scroll + bH > bE) || (to + mH == tH && scroll + bH < bE)) {scroll = bE - bH;}
		$$DP.inAnim1 = true;
		SOF.scrollerFP.bDown(scroll, b);
	},
	
	startUp: function(b, bE, t, tH, mH, amount) {
		var top = Math.abs(parseInt(t.style.top, 10));
		// New nurun
		var to = top - amount < 0 ? 0 : top - amount;
		//var to = top - amount <= 0 ? 0 : top - amount;
		if(to < $$DP.limit) {to = 0;}
		$$DP.inAnim = true;
		SOF.scrollerFP.tUp(to, t);
		//New nurun
		var scroll = parseInt(b.style.top, 10) - Math.ceil(bE * (top - to) / tH);
		//var scroll = Math.ceil(to / tH * mH);
		if((scroll <= 0) || (to === 0 && scroll !== 0)) {scroll = 0;}
		$$DP.inAnim1 = true;
		SOF.scrollerFP.bUp(scroll, b);
	},
	
	tDown: function(to, obj) {
		var top = Math.abs(parseInt(obj.style.top, 10));
		if(top >= to) {
			obj.style.top = - to + 'px';
			clearTimeout($$DP.timer);
			$$DP.timer = null;
			$$DP.inAnim = false;
		} else {
			obj.style.top = - (top + Math.ceil((to - top) / $$DP.animSlow)) + 'px';
			$$DP.timer = setTimeout(function() {SOF.scrollerFP.tDown(to, obj);}, $$DP.animDelay);
		}
	},
	
	tUp: function(to, obj) {
		var top = Math.abs(parseInt(obj.style.top, 10));
		if(top <= to) {
			obj.style.top = - to + 'px';
			clearTimeout($$DP.timer);
			$$DP.timer = null;
			$$DP.inAnim = false;
		} else {
			obj.style.top = - (top + Math.floor((to - top) / $$DP.animSlow)) + 'px';
			$$DP.timer = setTimeout(function() {SOF.scrollerFP.tUp(to, obj);}, $$DP.animDelay);
		}
	},
	
	bDown: function(to, obj) {
		var top = Math.abs(parseInt(obj.style.top, 10));
		if(top >= to) {
			obj.style.top = to + 'px';
			clearTimeout($$DP.timer1);
			$$DP.timer1 = null;
			$$DP.inAnim1 = false;
		} else {
			obj.style.top = top + Math.ceil((to - top) / $$DP.animSlow) + 'px';
			$$DP.timer1 = setTimeout(function() {SOF.scrollerFP.bDown(to, obj);}, $$DP.animDelay);
		}
	},
	
	bUp: function(to, obj) {
		var top = Math.abs(parseInt(obj.style.top, 10));
		if(top <= to) {
			obj.style.top = to + 'px';
			clearTimeout($$DP.fav.timer1);
			$$DP.timer1 = null;
			$$DP.inAnim1 = false;
		} else {
			obj.style.top = top + Math.floor((to - top) / $$DP.animSlow) + 'px';
			$$DP.timer1 = setTimeout(function() {SOF.scrollerFP.bUp(to, obj);}, $$DP.animDelay);
		}
	}
};

// affichage du flash pour la galerie :
SOF.displayGallery = function() {
	var gallery = new SWFObject("/flash/fh/galerie.swf", "gallerySWF", "900", "487", "8", "#ffffff");
	gallery.addParam("quality", 'best');
	gallery.addVariable("cat", "HO");
	gallery.addVariable("code", FH.getRid());
 	gallery.addVariable("brand", FH.getBrand().toUpperCase());
 	gallery.addVariable("mark", FH.getMark().toUpperCase());
 	gallery.addVariable("lang",FH.en2gb(FH.getLang()));
	gallery.write("gallery");
};

// chargement des fonctions
Box.events.load(SOF.fakePopups.init);
Box.events.load(SOF.favoris.init);

// déchargement (nettoyage variables)
Box.events.add(window, 'unload', function() {
	$$DP = null;
	SOF.datasFakePopups = null;
});

