/************************************************************************************
@ Author : Nicolas Castelli
@ Mail : nicolas.castelli2@gmail.com
@ Date of creation : 2008-01-01
@ Filename : myFloatMenu.js
@ Use : Définition de la classe permettant de créer le menu flottant de
l'application dans le VS Deck Maker.
Le menu flottant transfère des données d'une "boite" vers une
autre (au minimum 2 boites par menu).
************************************************************************************/
MyFloatMenu = function() {
	//**** VARIABLES PRIVÉES
	var id = "";
	//Tableaux d'objets qui ouvre le menu et qu'il faut manipuler
	var tAllObjToTrf = new Array();
	//Les différents contenants avec qui communique le menu
	var box1 = "";
	var box2 = "";
	var box3 = "";

	//**** VARIABLES PUBLIQUES

	//**** FONCTIONS PRIVÉES
	//Initialisation des items
	var initItems = function() {
		var items = $(id).getElementsByTagName("li");
		var item = "";
		for(var i = 0; i < items.length - 1; i++)
		{
			item = items[i];
			item.onclick = function() { onClickItem(this.id); };
			item.onmouseover = function() { overItem($(this.id)); };
			item.onmouseout = function() { outItem($(this.id)); };
		}
		//Dernier item pour fermer le menu
		item = items[i];
		item.onclick = function() { close(); };
		item.onmouseover = function() { overItem(this); };
		item.onmouseout = function() { outItem(this); };
	}

	//Ouvre le menu
	var open = function(evt) {
		var xPos = evt.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
		var yPos = evt.clientY + (document.body.scrollTop || document.documentElement.scrollTop);
		$(id).style.top = yPos - 20 +  'px';
		$(id).style.left = xPos + 20 + 'px';
		$(id).className = 'showed';
	}

	//Ferme le menu
	var close = function() {
		$(id).style.top = '0px';
		$(id).style.left = '0px';
		$(id).className = 'hidden';
		//On met à jour les couleurs de ligne du deck et du side
		box2.cancelTransfert();
		box3.cancelTransfert();
	}

	//On cache tous les items du menu
	var hideAllItems = function() {
		var list = $(id).getElementsByTagName("li");
		for(var i = 0; i < list.length - 1; i++)
		{
			list[i].style.display = 'none';
		}
	}

	//On cache tous les items de la liste, liste contenant les id des items
	var hideItems = function(list) {
		for(var i = 0; i < list.length; i++)
		{
			$(list[i]).style.display = 'none';
		}
	}

	//On montre tous les items de la liste, liste contenant les id des items
	var showItems = function(list) {
		for(var i = 0; i < list.length; i++)
		{
			$(list[i]).style.display = '';
		}
	}

	//*************** GESTION DES EVENEMENTS DU MENU ******************//
	//On change le style de l'item quand il est survolé
	var overItem = function(item) { item.className = "hover"; }

	//On change le style de l'item quand il n'est plus survolé
	var outItem = function(item) { item.className = "";	}

	//Fonction pour ajouter/déplacement/suppression des cartes dans le deck
	var onClickItem = function(id) {
		var arrInfos = id.split("_");
		var mode = arrInfos[0]
		var list = arrInfos[1];
		var qty = parseInt(arrInfos[2]);
		//S'il y a eu une sélection multiple, on fait une boucle pour traiter
		//toutes les cartes choisies
		if(tAllObjToTrf.length > 0)
		{
			for(var i = 0; i < tAllObjToTrf.length; i++)
			{
				var objToTrf = tAllObjToTrf[i][0];
				var maxQty = tAllObjToTrf[i][1];
				onClickItemAction(mode, list, objToTrf, qty, maxQty);
			}
			//on vide le contenu de transfert
			tAllObjToTrf.length = 0;
		}
		close();
	}

	//Interaction avec les différentes interfaces
	var onClickItemAction = function(mode, list, objToTrf, qty, maxQty) {
		switch(mode) {
			case "add":
				if(list == "deck")
					box2.update(objToTrf, qty);
				else if(list == "side")
					box3.update(objToTrf, qty);
			break;
			case "move":
				var updQty = qty;
				if(maxQty > 0 && ( qty == 0 || qty > maxQty))
					updQty = maxQty;
				if(list == "deck")
				{
					box2.update(objToTrf, updQty);
					box3.update(objToTrf, -updQty);
				}
				else if(list == "side")
				{
					box3.update(objToTrf, updQty);
					box2.update(objToTrf, -updQty);
				}
			break;
			case "remove":
				var updQty = qty;
				if(qty == 0) { updQty = maxQty; }
				if(list == "deck")
					box2.update(objToTrf, -updQty);
				else if(list == "side")
					box3.update(objToTrf, -updQty);
			break;
		}
	}

	//**** FONCTIONS PUBLIQUES

	//Ouvre le menu
	this.show = function(evt) { open(evt); }

	//Ferme le menu
	this.close = function() { close(); }

	//Constructeur de classe
	this.construct = function(idElt, refWbk, refDeck, refSide) {
		id = idElt;
		box1 = refWbk;
		box2 = refDeck;
		if(refSide)
			box3 = refSide;
	}

	//Initialise le menu et les options qu'il contient
	//1 pour Ajout de cartes
	//2 pour le retrait de cartes depuis le deck
	//3 pour le retrait de cartes depuis le side
  this.init = function(mode) {
  	var addItems = new Array("add_deck_1", "add_deck_4", "add_deck_10", "add_side_1", "add_side_4");
  	var moveDeckItems = new Array("add_side_1_0", "add_side_4_0", "move_deck_1", "move_deck_4", "move_deck_0", "remove_side_1", "remove_side_0");
  	var moveSideItems = new Array("add_deck_1_0", "add_deck_4_0", "move_side_1", "move_side_4", "move_side_0", "remove_deck_1", "remove_deck_0");
  	//On initialise les fonctions sur les différents élements du moment
		initItems();
  	//On masque et on affiche
  	hideAllItems();
  	switch(mode) {
  		case 1:
  			showItems(addItems);
  		break;
  		case 2:
  			showItems(moveDeckItems);
  		break;
  		case 3:
  			showItems(moveSideItems);
  		break;
  	}
  }

  //Pour préparer le transfert de la carte dans le deck
  this.prepareTransfert = function(evt, chosenCard, mode, idBox) {
  	//Si l'utilisateur n'est pas connecté, le menu de création de decks
  	//n'existe pas et il ne peut pas créer de decks.
  	if($(id))
  	{
	  	this.init(mode);
	  	this.show(evt);
	  	tAllObjToTrf = chosenCard;
	  	//Un click dans une boite annule les transfert dans l'autre.
	  	//Paramètre non obligatoire
	  	if(idBox)
	  	{
	  		(idBox == "deck") ? box3.cancelTransfert() : box2.cancelTransfert();
	  	}
	  }
  }

}//Fin de la classe MyFloatMenu

