/**Fonctions étendant les objets prototype**/

var customMethods = {
	/* Fait disparaitre/apparaitre progressivement un élément
	*	way		si null, toggle automatique, sinon : 1 => apparaitre seulement, -1 => disparaitre seulement
	*	remove	indique si l'élément doit être supprimé une fois masqué
	*/
	toggleSmooth : function(element, way, remove){
		var visible = element.visible();
		if((way == 1 && visible) || (way == -1 && !visible)) return false;				
		
		element.show();
		var height = element.getHeight();
		if(!visible) element.hide();
		var height_pro_loop = (height/10);
		var overflow = element.getStyle('overflow');
		
		element.setStyle({overflow : 'hidden'});
		$R(0, 10).each(	function(i){
			var current_height = (element.visible() ? height-(i*height_pro_loop) : i*height_pro_loop);
			var opacity = 10*(element.visible() ? 10-i : 0+i);
			var last = (i == 10);
			(function(){
				if(!opacity){
					element.toggle();
					if(remove) element.remove();
				}
				element.setStyle({height : current_height+'px', opacity : (opacity/100)});
				if(last) element.setStyle({overflow : overflow, height : height+'px'});
			}).delay(0.02*i);
		});
	},
	
	/*Ouvre une lightbox avec l'image sur laquelle est appelée la fonction*/
	lightbox : function(element, title){
		var body = $$('body').first();
		
		//Fond gris
		var grey = new Element('div');
		grey.setStyle({width: '100%', height: '100%', position:'fixed', top: '0px', left: '0px', backgroundColor: '#000000'});
		grey.setOpacity(0);
		body.insert({'top': grey});
		
		//Div contenant l'image
		var div = new Element('div');
		var borderWidth = (title ? '0px 5px 1px 5px' : '0px 5px 5px 5px');
		div.setStyle({fontFamily: 'Arial', border: '5px solid #FFFFFF', borderWidth: borderWidth, backgroundColor: '#FFFFFF', position: 'fixed', top: '50%', left: '50%', zIndex: '1000'});
		//Ajout du titre s'il y en a un
		div.update(title);
		div.setOpacity(0.5);
		
		//Image
		var img = new Element('img', {'src': element.src, 'title': 'Close'});
		img.setStyle({display: 'block', cursor: 'pointer'});
		
		div.insert({'top': img});
		body.insert({'top': div});
		
		//Lien de fermeture
		var close = new Element('div', {'title': 'Close'});
		close.setStyle({cursor: 'pointer', textAlign: 'right', fontWeight: 'bold', paddingRight: '1px'});
		close.update('x');
		div.insert({'top': close});
		
		//Redimensionnement de l'image si elle est plus grande que la fenetre
		var maxWidth = document.viewport.getWidth()-100;
		var maxHeight = document.viewport.getHeight()-100;
		var width = img.getWidth();
		var height = img.getHeight();
		if(width > maxWidth){
			height = (height*maxWidth/width);
			width = maxWidth;
		}
		if(height > maxHeight){
			width = (width*maxHeight/height);
			height = maxHeight;
		}
		img.setStyle({width: width+'px', height: height+'px'});
		
		//Positionnement de la div
		div.setStyle({
			marginLeft: -(img.getWidth()/2)+'px',
			marginTop: -((img.getHeight()+50)/2)+'px'
		});
		
		//Apparition progressive
		$R(0, 5).each(function(i){
			Element.setOpacity.delay(i/40, div, ((5+i)/10));
			Element.setOpacity.delay(i/40, grey, i/10);
		});						
		
		//Fermeture
		img.on('click', function(){
			div.remove();
			grey.remove();
		});
		close.on('click', function(){
			div.remove();
			grey.remove();
		});
	},
	
	/* Remplace l'affichage au survol du titre de l'élément par l'affichage d'une bulle contenant le titre*/
	initInfobulle : function(element){
		if(element.readAttribute('title')){
			if(element && !element.readAttribute('title')) return false;
			
			var title = element.readAttribute('title');
			element.removeAttribute('title');
			element.on('mousemove', function(e){
				if(!$('infobulle')){
					var infobulle = new Element('div', {'id' : 'infobulle'}).update(title);
					($$('body').first()).insert({'top' : infobulle});
				}
				var left = (e.pointerX()+15);
				if(left+$('infobulle').getWidth() > document.viewport.getWidth()+document.viewport.getScrollOffsets().width) left = (e.pointerX()-($('infobulle').getWidth()+5))
				var top = (e.pointerY()+15);
				if(top+$('infobulle').getHeight() > document.viewport.getHeight()+document.viewport.getScrollOffsets().top) top = (e.pointerY()-($('infobulle').getHeight()+5))
				$('infobulle').setStyle({top : top+'px', left : left+'px'});
			});
			
			element.on('mouseout', function(e){
				if($('infobulle')) $('infobulle').remove();
			/*
				$R(1, 10).each(function(i){
					(function(){
						if($('infobulle')){
							$('infobulle').setOpacity((10-i)/10);
							if(i == 10) $('infobulle').remove();
						}
					}).delay(0.01*i);
				});
			*/
			});
		}
	},
	
	getX : function(element){
		var dimensions = element.cumulativeOffset();
		return dimensions[0];
	},
	getY : function(element){
		var dimensions = element.cumulativeOffset();
		return dimensions[1];
	},
	
	/*Passe un élément en position absolue*/
	makeAbsolute : function(element){
		var positions = element.cumulativeOffset();
		alert(positions);
		element.setStyle({position: 'absolute', left: positions[0]+'px', top: positions[1]+'px'});
	},
	
	/*Retourne la valeur d'une propriété CSS3 en fonction de ce qui est supporté par le navigateur, retourne également la propriété supportée*/
	getCSS3Style : function(element, style){
		var values = $H({'style' : null, 'value' : null});
		var navs = $A(['', '-moz-', '-webkit-', '-o-']);
		navs.each(function(nav){
			var nav_style = nav+style;
			if(element.getStyle(nav_style)){
				values.set('style', nav_style);
				values.set('value', element.getStyle(nav+style));
				return values;
			}
		});
		return values;
	},
	/*Ajoute une propriété CSS3*/
	setCSS3Style : function(element, hash){
		var navs = $A(['', '-moz-', '-webkit-', '-o-']);
		hash = $H(hash);
		hash.each(function(row){
			navs.each(function(nav){
				element.style.setProperty(nav+row.key, row.value,"");			
			});
		});
	}
}
Element.addMethods(customMethods);

/*Autres ajouts de méthodes*/
var extendArray = {
	insert : function(value){
		this[this.size()] = value;
		return this;
	}
}
Object.extend(Array.prototype, extendArray);

var extendString = {
	utf8_encode : function(){
		return unescape(encodeURIComponent(this));
	},
	
	utf8_decode : function(){
		return decodeURIComponent(escape(this));
	}
}
Object.extend(String.prototype, extendString);
