/**
 * Contrôles spécifiques sur les documents.
 * 
 * @require	jQuery
 */
(function($) {

	/**
	 * Création ou récupération d'espaces de noms spécifiques.
	 */
	
	var P = window.PAGE || (window.PAGE = {});
	var $docActions = P.docActions || (P.docActions = {});
	
	/**
	 * Id d'éléments de la page et classes qu'ils peuvent porter.
	 */
	
	var sDocActionsClass = "document-actions";
	
	var sBiggerFontActionClass = "action-fontBigger";
	var sSmallerFontActionClass = "action-fontSmaller";
	var sPrintActionClass = "action-print";
	var sSendActionClass = "action-send";
	
	var sDocIdClass = "document-id";
	var sVariableFontSizeClass = "variable-font-size";
	
	var sDisabledClass = "disabled";
	
	/**
	 * Variables.
	 */
	
	var sLinkWrapDef = "<a href='{href}'></a>";
	var sSendDocHref = "jsp/site/plugins/document/SendDocument.jsp?document_id={id}";
	var iMinFontSize = 1; // px
	var iMaxFontSize = 36; // px
	var iDefaultFontSize = 12; // px /* body @font-size */
	
	function getActionButtons(sActionClass) {
		return $("." + sDocActionsClass + " ." + sActionClass);
	}
	
	var _hFirstFontSizeChangeDone = {};
	
	/**
	 * Modifie la taille de police d'un ou plusieurs éléments.
	 * 
	 * @param	jQuery	jElem		Elément(s) à affecter.
	 * @param	int		iSizeDiff	Delta de taille de police à appliquer.
	 */
	function alterFontSize(jElem, iSizeDiff) {
		
		var bFirst = !_hFirstFontSizeChangeDone[iSizeDiff];
		_hFirstFontSizeChangeDone[iSizeDiff] = true;
		
		jElem.each(function() {
			
			var jThis = $(this);
			var iNewFontSize = Number(jThis.css("font-size").replace("px", "")) + iSizeDiff;
			
			if (bFirst && iNewFontSize > iMaxFontSize) {
				
				// Sous IE, la première fois, certains éléments peuvent ne pas
				// avoir de font-size cohérente (jQuery semble répondre la
				// hauteur du conteneur). On suppose alors que ces éléments ont
				// une taille de texte par défaut, héritée.
				
				iNewFontSize = iDefaultFontSize + iSizeDiff;
			}
			
			if (iMinFontSize <= iNewFontSize && iNewFontSize <= iMaxFontSize) {			
				jThis.css("font-size", iNewFontSize + "px");
			}
		});		
	}
	
	/**
	 * Fournit les éléments de la page dont la taille de police est susceptible
	 * d'être modifiée sur demande du visiteur.
	 */
	function getVariableFontSizeElements() {
		
		var jVariable = $("." + sVariableFontSizeClass);
		
		jVariable = jVariable.add("." + sVariableFontSizeClass + " h1");
		jVariable = jVariable.add("." + sVariableFontSizeClass + " h2");
		jVariable = jVariable.add("." + sVariableFontSizeClass + " h3");
		jVariable = jVariable.add("." + sVariableFontSizeClass + " h4");
		jVariable = jVariable.add("." + sVariableFontSizeClass + " h5");
		 
		return jVariable;
	}
	
	/**
	 * Configure tous les boutons de changement de taille de police pour
	 * affecter un certain nombre de conteneurs spécialement marqués.
	 */
	function initFontSizeChanges() {
		
		var jVariable = getVariableFontSizeElements();		
		var jBigger = getActionButtons(sBiggerFontActionClass);
		var jSmaller = getActionButtons(sSmallerFontActionClass);
		
		if (jVariable.length > 0) {
		
			jBigger.click(function() {
				alterFontSize(jVariable, 1);
			});
			
			jSmaller.click(function() {
				alterFontSize(jVariable, -1);
			});
		}
		else {
			
			jBigger.addClass("disabled");
			jSmaller.addClass("disabled");
		}
	}
	
	/**
	 * Configure les boutons d'impression. 
	 */
	function initPrint() {
		
		getActionButtons(sPrintActionClass).click(function() {
			window.print();
		});
	}
	
	/**
	 * Configure tous les boutons d'envoi de document pour envoyer celui dont
	 * l'identifiant figure dans la première ancre dédiée.
	 */
	function initSend() {
		
		var jAnchor = $("." + sDocIdClass);
		var jSend = getActionButtons(sSendActionClass);
		var bPresent = false;
		
		if (jAnchor.length > 0 && jSend.length > 0) {
			
			var sDocId = jAnchor.attr("name");
			
			if (!!sDocId) {
				
				bPresent = true;
				
				jSend.wrap(sLinkWrapDef.supplant({
					href: sSendDocHref.supplant({id: sDocId})
				}));
				
				jSend.closest("a").attr("target", "_blank");
			}
		}
		
		if (!bPresent) {
			jSend.addClass("disabled");
		}
	}
	
	/**
	 * Mise en place au chargement de la page.
	 */
	$(document).ready(function() {
		
		initFontSizeChanges();
		initPrint();
		initSend();
	});
})
(jQuery);