var EcranPlat = {
	
	/**
	 * url du projet
	 */
	url: null,

	/**
	 * Statut du debug
	 */
	debug: false,
	
	/**
	 * Gestion de la surface du client
	 */	
	surface: null,
	
	/**
	 * Gestion de la souris
	 */
	sourisX: 0,
	sourisY: 0,
	
	/**
	 * Gestion des infos bulles
	 */
	jBulle: null,
	
	/**
	 * Gestion du curseur
	 */
	jCurseur: null,
	
	curseurOption: {},

	/**
	 * Gestion des sélections
	 */
	selection: {},
	
	/**
	 * Execute une requête ajax
	 */
	ajax: function(page, params, action) {

		success = function(json) {

			if (typeof json !== 'object') {
				alert("Une erreur est survenue lors de la requête !");
				return ;
			}

			if (json.redirection !== undefined) {
				window.location.replace(EcranPlat.url + json.redirection);
				return ;
			}
			
			if (json.alert !== undefined) {
				alert(json.alert);
				return ;
			}
			
			if (json.updater !== undefined) {
				for(selecteur in json.updater) {
					$(selecteur).html(json.updater[ selecteur ]).show();
				}
			}

			if (action !== undefined) {
				action(json);
			}
			
		}
		
		error = function(XMLHttpRequest, textStatus) {
			var description = EcranPlat.debug === true ? "\n(erreur : " + textStatus + ")" : '';
			alert("Une erreur est survenue lors de la requête !" + description);
		}
		
		$.ajax({
			type: "post",
			url: this.url + page,
			data: params,
			dataType: "json",
			success: success,
			error: error
		});
		
	},
	
	/**
	 * Met à jour les coordonées de la surface
	 */
	_actualiseSurface: function() {
	
		EcranPlat.surface = {};
		EcranPlat.surface['gauche'] = (document.documentElement && document.documentElement.scrollLeft) || window.pageXOffset || self.pageXOffset || document.body.scrollLeft;
		EcranPlat.surface['haut'] = (document.documentElement && document.documentElement.scrollTop) || window.pageYOffset || self.pageYOffset || document.body.scrollTop;
		EcranPlat.surface['droite'] = EcranPlat.surface['gauche'] + (document.documentElement && document.documentElement.clientWidth) || window.innerWidth || self.innerWidth || document.body.clientWidth;
		EcranPlat.surface['bas'] = EcranPlat.surface['haut'] + (document.documentElement && document.documentElement.clientHeight) || window.innerHeight || self.innerHeight || document.body.clientHeight;

	},
	
	/**
	 * Met à jour les coordonées de la souris et des éléments liés
	 */
	_actualiseSouris: function(e) {
	
		EcranPlat.sourisX = e.pageX;
		EcranPlat.sourisY = e.pageY;
				
		if (EcranPlat.jBulle !== null) {
			EcranPlat._deplaceBulle();
		}
		
		if (EcranPlat.jCurseur !== null) {
			EcranPlat._deplaceCurseur();
		}
	
	},

	/**
	 * Affiche une info bulle en survole de jElement
	 */
	infoBulle: function(jElement, bulle, texte) {
	
		EcranPlat.jBulle = $('#' + bulle);
		
		EcranPlat.jBulle.html(texte);
		EcranPlat._deplaceBulle();
		EcranPlat.jBulle.show();
		
		jElement.mouseleave(EcranPlat._unBulle);
		
	},
	
	/**
	 * Affiche la bulle en survolle de hover sans modifier le contenu
	 */
	hoverBulle: function(hover, bulle) {
	
		$('#' + hover).hover(
			function() {
				EcranPlat.jBulle = $('#' + bulle);
				EcranPlat._deplaceBulle();
				EcranPlat.jBulle.show();
			},
			function() {
				EcranPlat._unBulle();
			}
		);
		
	},

	/**
	 * Déplace l'info bulle actuelle en fonction de la souris
	 */	
	_deplaceBulle: function() {
		
		var wBulle = EcranPlat.jBulle.width();
		var hBulle = EcranPlat.jBulle.height();
		
		var x = EcranPlat.sourisX;
		var y = EcranPlat.sourisY - hBulle / 3;
		
		if (x > EcranPlat.surface.droite - (wBulle + 50)) {
			x -= wBulle + 30;
		}
		else {
			x += 30;
		}
		
		y = borne(y, EcranPlat.surface.haut + 10, EcranPlat.surface.bas - (hBulle + 20));
		
		EcranPlat.jBulle.css({left: x + 'px', top: y + 'px'});
		
	},
	
	/**
	 * Stop la bulle en cours
	 */
	_unBulle: function() {
		
		if (EcranPlat.jBulle !== null) {
			EcranPlat.jBulle.hide();
			EcranPlat.jBulle = null;
		}
	
	},

	/**
	 * Gestion du curseur informatif
	 */
	 curseur: function(element, option) {
	 
	 	if (element === null) {
			EcranPlat._unCurseur();
	 		return ;
	 	}
	 		 	
	 	EcranPlat.curseurOption.top = 0;
	 	EcranPlat.curseurOption.left = 20;
	 	
	 	if (option !== undefined) {
		 	if (option.top !== undefined) {
		 		EcranPlat.curseurOption.top = option.top;
		 	}
		 	if (option.left !== undefined) {
		 		EcranPlat.curseurOption.left = option.left;
		 	}
		}
	 	
	 	EcranPlat.jCurseur = $('#' + element);
	 	EcranPlat._deplaceCurseur();
	 	EcranPlat.jCurseur.show();
	 	
	 },

	/**
	 * Déplace le curseur en fonction de la souris
	 */	
	_deplaceCurseur: function() {
		
		var x = EcranPlat.sourisX + EcranPlat.curseurOption.left;
		var y = EcranPlat.sourisY + EcranPlat.curseurOption.top;
			
		EcranPlat.jCurseur.css({left: x + 'px', top: y + 'px'});
		
	},
	
	/**
	 * Stop le curseur en cours
	 */
	_unCurseur: function() {
	
 		if (EcranPlat.jCurseur !== null) {
	 		EcranPlat.jCurseur.hide();
	 		EcranPlat.jCurseur = null;
	 	}
	 	
	},
	
	/**
	 * Demande la gestion d'une sélection
	 */	
	gereSelection: function(selecteur, groupe) {
	
		if (selecteur === undefined) {
			selecteur = ".selection";
		}
	
		if (groupe === undefined) {
			groupe = 'defaut';
		}
			
		$(selecteur).hover(
			function () {
				$(this).addClass('selectionHover');
			}, 
			function () {
				$(this).removeClass('selectionHover');
			}
		);
		
		$(selecteur).click(function () {
			EcranPlat.afficheSelection($(this), groupe);
		});
		
	},
	
	selectionne: function(selecteur, groupe) {

		if (groupe === undefined) {
			groupe = 'defaut';
		}
		
		EcranPlat.afficheSelection($(selecteur), groupe);
		
	},
	
	afficheSelection: function(jElement, groupe) {
	
		if (EcranPlat.selection[ groupe ] !== undefined) {
			EcranPlat.selection[ groupe ].removeClass('selectionSelected');
		}
		EcranPlat.selection[ groupe ] = jElement;
		EcranPlat.selection[ groupe ].addClass('selectionSelected');
		
	},
	
	/**
	 * Retourne un attribut src avec l'url complète
	 */
	 src: function(url) {
	 
	 	return 'src="' + EcranPlat.url + url + '"';
	 	
	 }
	 
}

/**
 * Fonctions pratiques
 */
function clone(objet) {
	if (typeof objet !== 'object' || objet === null) {
		return objet;
	}
	var objetClone = objet.constructor();
	for(var key in objet) {
		objetClone[ key ] = clone(objet[ key ]);
	}
	return objetClone;
}

function rand(min, max) {
	var rand = Math.random();
	rand = rand * ((max + 1) - min);
	rand = Math.floor(rand);
	return rand + min;
}

function keys(tableau) {
	var keys = [];
	var count = 0;
	for (key in tableau) {
		keys[count++] = key;
	}
	return keys;
}

function randArray(tableau) {
	return tableau[ rand(0, tableau.length - 1) ];
}

function numFin(string) {
	return parseInt(string.substring(string.lastIndexOf('-') + 1));
}

function borne(valeur, min, max) {
	return Math.min(Math.max(valeur, min), max);
}

/**
 * Evènements et actions du DOM
 */
$(window).bind('scroll resize', EcranPlat._actualiseSurface);

$(document).bind('mouseover mousemove', EcranPlat._actualiseSouris);

$(function() {

	EcranPlat._actualiseSurface();

	/**
	 * Gestion du scroll fluide entre les ancres
	 */
	$('.scrollTo').click(function() {
	
		var jCible = $($(this).attr('href'));
		
		if (jCible.length > 0) {		
			var position = jCible.position();
			$('html, body').animate({scrollTop: position.top - 50}, 400);
		}
		else if (EcranPlat.debug === true) {
			alert("Erreur scrollTo, cible inconnue : " + $(this).attr('href'));
		}
		
		return false;
		
	});
	
});
