
/**
 * Ferme la popup après avoir lancé une action Ajax.
 * @param a_action	(String)	action
 * @param	a_options	(Object)	éventuels paramètres à soumettre {param1:'', ...}
 */
function sendClosePopup(a_action, a_options) {
  // on soumet
  sendFromPopup(a_action, a_options);
  
  // on ferme
  //closePopup();
}

/**
 * Lance une action Ajax depuis la popup.
 * @param a_action	(String)	action
 * @param	a_options	(Object)	éventuels paramètres à soumettre {param1:'', ...}
 */
function sendFromPopup(a_action, a_options) {
	var l_form = getMainForm();
  a_options.process = l_form.process.value;
  a_options.key = l_form.key.value;
  a_options.link_id = l_form.link_id.value;
  a_options._action = a_action;
  a_options.reloadPage = true;
  
  // on soumet
  new Safran.Ajax.Validation(l_form.action, {parameters : a_options});
}

var Safran = {};
Safran.Ajax = {};
Safran.Ajax.Validation = Class.create(Ajax.Request, {
  initialize: function($super, url, options) {
  	options.onSuccess = this.onSuccess.bind(this); 
  	$super(url, options);
  },
  
  onSuccess : function(response) {
    if (response.responseText != '') {
    	alert(response.responseText);
    } else if (this.options.parameters.reloadPage === true) {
    	closePopup();
    	window.location.reload(true);
    }
  }
});

/**
 * Affiche le cache total (simulation des "popup" modales)
 */
function displayModalCache(a_index) {
	if ($('modalCache')) {
		// le cache existe déjà ! -> on ne fait rien
		return;
	}
	// on crée le div
	var l_modalDiv = document.createElement("div");
	l_modalDiv.id = 'modalCache';
	
	// on définit ses éléments de style
	l_modalDiv.style.position = "absolute"; 
	l_modalDiv.style.	background = "url(../_imgs/popup/transp.gif)";
	l_modalDiv.style.left = "0";
	l_modalDiv.style.top = "0";
	l_modalDiv.style.width = (document.body.clientWidth) + "px";
	l_modalDiv.style.height = (document.body.clientHeight) + "px";
	l_modalDiv.style.zIndex = a_index;
	
	document.body.appendChild(l_modalDiv);
}
	
/**
 * Supprime le cache total (simulation des "popup" modales)
 */
function hideModalCache() {
	var l_modalDiv = $('modalCache');
	if (l_modalDiv) {
		l_modalDiv.remove();
	}
}

_CACHE_Z_INDEX = '1000000';
_POPUP_Z_INDEX = '1000001';
/**
 * gestionnaire de popup dynamique
 * Si identifiant de la popup = 'idX', on recherche :
 * 			- 'idX_close' pour la fermeture
 * 			- 'idX_move' pour le déplacement de la popup
 * 			- 'idX_resize' pour le redimensionnement de la popup
 */
var PopupMng = Class.create({
	popup: null,
	closeCallback: null,
	
	initialize : function(a_popupId) {
		this.popup = $(a_popupId);
		if (!this.popup) {
			// pas de div, on alerte et on arrête
			alert('Popup ' + a_popupId + ' non trouvée.');
			return;
		}
		
		// centrage
		this.center();
		
		// fermeture
		this.observeClose();
		
		// déplacement
		MoveMng.addPopup(a_popupId);
		
		// redimensionnement
		ResizeMng.addPopup(a_popupId);
	},
	
	setCloseCallback : function(a_closeCallback) {
		this.closeCallback = a_closeCallback;
	},
	
	showModal : function() {
		this.displayModalCache();
		this.show();
	},

	show : function() {
		this.popup.style.zIndex = _POPUP_Z_INDEX;
		this.popup.show();
	},
	
	hide : function() {
		this.popup.hide();
		this.popup.remove();
	},
	
	doClose : function(a_event) {
		this.closePopup();
		Event.stop(a_event);
	},
	
	observeClose : function() {
		var l_closeId = this.popup.id + '_close';
		var l_closeElt = $(l_closeId);
		if (l_closeElt) {
			var me = this;
			l_closeElt.observe('click', this.doClose.bind(me));
			l_closeElt.title = 'Fermer';
		}
	},
	
	center : function() {
		// centre la popup au milieu de l'écran visible
		var l_size = this.popup.getDimensions();
		var l_dimensions = document.viewport.getDimensions();
		var l_scrollOffsets = document.viewport.getScrollOffsets();
		
		this.popup.style.left = (l_scrollOffsets.left + (l_dimensions.width - l_size.width) / 2) + "px";
		this.popup.style.top = (l_scrollOffsets.top + (l_dimensions.height - l_size.height) / 2) + "px";
	},
	
	displayModalCache : function() {
		displayModalCache(_CACHE_Z_INDEX);
	},
	
	hideModalCache : function() {
		hideModalCache();
	},
	
	closePopup : function() {
		// callback ?
		if (this.closeCallback) {
			this.closeCallback();
		}

		// fermeture
		this.unobserveClose();
		
		// déplacement
		MoveMng.removePopup(this.popup.id);
		
		// redimensionnement
		ResizeMng.removePopup(this.popup.id);
		
		// cache
		this.hideModalCache();
		
		// popup
		this.hide();
	},
	
	unobserveClose : function() {
		var l_closeId = this.popup.id + '_close';
		var l_closeElt = $(this.popup.id + '_close');
		if (l_closeElt) {
			l_closeElt.stopObserving();
		}
	}
});

var PopupAideMng = Class.create(PopupMng, {

	doClose : function(a_event) {
		this.popup.hide();
		Event.stop(a_event);
	},
	
	displayAide : function(a_id) {
		var l_datas = $('aide_' + a_id);
		if (l_datas) {
			$('content_aide').update(l_datas.innerHTML);
		}
		this.show();
	}
});

/**
 * gestionaire de déplacement
 */
var MoveMng = {
	extension : '_move',
	_movedDivs : {},

	/**
	 * Ajoute la "popup" spécifiée par l'id de sa barre de titre au système de gestion du drag
	 * @param	a_barId		(String)	id de la barre de titre
	 */	
	addPopup : function(a_popupId) {
		var l_moveId = a_popupId + this.extension;
		var l_moveElt = $(l_moveId);
		if (l_moveElt) {
			this._movedDivs[l_moveId] = $(a_popupId);
			l_moveElt.observe('mousedown', MoveMng.doDragStart.bind(MoveMng));
		}
	},
	
	removePopup : function(a_popupId) {
		var l_moveId = a_popupId + this.extension;
		if (this._movedDivs[l_moveId]) {
			this._movedDivs[l_moveId] = null;
			$(l_moveId).stopObserving();
		}
	},
	
	/**
	 * Initialise les variables de l'API au début du déplacement d'un noeud HTML 
	 * "glissé" par l'utilisateur.
	 * @param a_event (Event) événement qui vient de se produire.
	 */
	doDragStart : function(a_event) {
		var l_eltId = Event.element(a_event).id;
		if (!l_eltId.endsWith(this.extension)) {
			// on arrête de suite
			return;
		}
		this.movedElement = this._movedDivs[l_eltId];
	
		this.left = parseInt(this.movedElement.style.left);
		this.top = parseInt(this.movedElement.style.top);
	
		this.leftStart = a_event.pageX;
		this.topStart = a_event.pageY;
	
		// Changement de gestionnaire d'événement
		document.observe('mousemove', MoveMng.doDrag.bind(MoveMng));
		document.observe('mouseup', MoveMng.doDragEnd.bind(MoveMng));
		Event.stop(a_event);
	
		// on conserve en mémoire le fait que l'on commence un drag
		window.isOnDrag = true;
	},

	/**
	 * Effectue le déplacement d'un noeud HTML "glissé" par l'utilisateur.
	 * @param a_event (Event) événement qui vient de se produire.
	 */
	doDrag : function(a_event) {
		var l_mouseX = a_event.pageX;
		var l_mouseY = a_event.pageY;
	
		this.movedElement.style.left = (this.left + (l_mouseX - this.leftStart)) + "px";
		this.movedElement.style.top = (this.top + (l_mouseY - this.topStart)) + "px";
	
		Event.stop(a_event);
	},

	/**
	 * Exécute le traitement de fin de déplacement d'un élément HTML, à savoir 
	 * la remise en état initial de toutes les variables utilisées lors du déplacement, 
	 * @param a_event (Event) événement qui vient de se produire.
	 */
	doDragEnd : function(a_event) {
		document.stopObserving('mousemove');
		document.stopObserving('mouseup');

		this.movedElement = null;
		Event.stop(a_event);
	
		// on supprime de la mémoire le fait que l'on commence un drag
		window.isOnDrag = false;
	}
};


/**
 * gestionaire de redimensionnement
 */
var ResizeMng = {
	_resizedDivs : {},
	
	/**
	 * Ajoute la "popup" spécifiée par l'id du coin bas au système de gestion du drag
	 * @param	a_cornerId		(String)	id du coin bas
	 */	
	addPopup : function(a_popupId) {
		var l_resizeId = a_popupId + '_resize';
		var l_resizeElt = $(l_resizeId);
		if (l_resizeElt) {
			var l_resizedDiv = $(a_popupId);
			if (!isNaN(parseInt(l_resizedDiv.style.height))) {
				l_resizeElt.style.cursor = 'se-resize';
			}
			this._resizedDivs[l_resizeId] = $(a_popupId);
	
			l_resizeElt.observe('mousedown', ResizeMng.doDragStart.bind(ResizeMng));
		}
	},
	
	removePopup : function(a_popupId) {
		var l_resizeId = a_popupId + '_resize';
		if (this._resizedDivs[l_resizeId]) {
			this._resizedDivs[l_resizeId] = null;
			$(l_resizeId).stopObserving();
		}
	},
	
	/**
	 * Initialise les variables de l'API au début du déplacement d'un noeud HTML 
	 * "glissé" par l'utilisateur.
	 * @param a_event (Event) événement qui vient de se produire.
	 */
	doDragStart : function(a_event) {
		this.resizedElement = this._resizedDivs[Event.element(a_event).id];
	
		this.width = parseInt(this.resizedElement.style.width);
		this.height = parseInt(this.resizedElement.style.height);
	
		this.leftStart = a_event.pageX;
		this.topStart = a_event.pageY;
	
		// Changement de gestionnaire d'événement
		document.observe('mousemove', ResizeMng.doDrag.bind(ResizeMng));
		document.observe('mouseup', ResizeMng.doDragEnd.bind(ResizeMng));
		Event.stop(a_event);
	
		// on conserve en mémoire le fait que l'on commence un drag
		window.isOnDrag = true;
	},
	
	/**
	 * Effectue le redimensionnement d'un noeud HTML "glissé" par l'utilisateur.
	 * @param a_event (Event) événement qui vient de se produire.
	 */
	doDrag : function(a_event) {
		var l_mouseX = a_event.pageX;
		var l_mouseY = a_event.pageY;
	
		this.resizedElement.style.width = (this.width + (l_mouseX - this.leftStart)) + "px";
		if (!isNaN(this.height)) {
			this.resizedElement.style.height = (this.height + (l_mouseY - this.topStart)) + "px";
		}
		var l_scrollDiv = $('scrollDiv');
		if (l_scrollDiv) {
			l_scrollDiv.style.width = (this.width - 70 + (l_mouseX - this.leftStart)) + "px";
			if (!isNaN(this.height)) {
				l_scrollDiv.style.height = (this.height - 115 + (l_mouseY - this.topStart)) + "px";
			}
		}
	
		Event.stop(a_event);
	},

	/**
	 * Exécute le traitement de fin de déplacement d'un élément HTML, à savoir 
	 * la remise en état initial de toutes les variables utilisées lors du déplacement, 
	 * @param a_event (Event) événement qui vient de se produire.
	 */
	doDragEnd : function(a_event) {
		document.stopObserving('mousemove');
		document.stopObserving('mouseup');

		this.resizedElement = null;
		Event.stop(a_event);
	
		// on supprime de la mémoire le fait que l'on commence un drag
		window.isOnDrag = false;
	}
}

