// JavaScript Document
//alert("yo"); // test fichier
//alert($); // test jquery


/*********************/
/* VARIABLES GLOBALE    */
/*********************/
var ps; // minix projets 
var psinfos; // infos projets 
var psimages; // images projets 
var nbps; // nombre projets
var tripsi // defini le melange actuel;
var wCont; // largeur conteneur div#minix
var nbpsw ; // nombre d'image projets en largeur conteneur

var wInImg; // largeur in objet image projet
var hInImg; // hauteur in objet image projet
var wImg; // largeur out objet image projet (marges incluses)
var hImg; // hauteur out objet image projet (marges incluses)
var nbpw; // nombre d'image en largeur
var marginImg; // marge des images;
var borderImg; // bordure des images
var placementCourant="depart";  // sauve le placement en cours
var groupementCourant; // sauve le groupement en cours
var Groupes; // les groupes du groupement en cours
var nbClickLayouts = readCookie("moves_compteur");
if(!nbClickLayouts) nbClickLayouts = 0;
/*********************/
/* CONFIG PLACEMENTS    */
/*********************/
var zoomF = 1; // facteur de zoom au survol
var zoomSpeed = 200; // duree du zoom de survol
var zoomObject = document; // stocke le zoom en cours, document valeur par défaut
var puissanceMelangeRandom = 1 ;// intensite du mélange normal àléatoire (de 0 à 4, float)
var duree = 1000 ; // duree des placements
var retard = 0; // retard de fin de placement entre le 1er et le dernier projet
var x0 ; // centrage x
var y0 = 300; // centrage y
var rmax = 250; // cercle et spirale
var nbTours = 3; // spirale
/*********************/
/* INIT              */
/*********************/

$(document).ready(function(){
/*=================================================================================*/
//alert("init");

ps = $("#minix img");
nbps = ps.size();
marginImg = parseInt(ps.css('marginTop'));

//alert(parseInt(ps.css('borderLeftWidth')));
//alert(parseInt(ps.css('borderWidth')));
borderImg = parseInt(ps.css('borderLeftWidth'));

wInImg = ps.width();
hInImg = ps.height();
wImg = ps.outerWidth()+2*marginImg;
hImg = ps.outerHeight()+2*marginImg;
//alert(wImg);

wCont = $('#minix').width();//-wImg;
x0 = (wCont-wImg)/2;
nbpsw = Math.floor(wCont/(wImg));



// recup des infos et des images projets au format JSON dans les div cachés apres chaque image
psinfos = new Array();
psimages = new Array();
ps.each(function(i){ 
	psinfos[i] =  eval($(this).next().html()); 
	psimages[i] =  eval($(this).next().next().html()); 
});
//alert(psinfos[0].annee);
// tri initial : pas de tri 
tripsi = new Array(nbps);
//triAucun();

//alert(nbps);
for(var i = 0;i<nbps;i++)
	tripsi[i] = i;


// placement initial 
placeProjets("depart");
//triHue()

// event de survol 
ps.hover(function(e){
		// OVER	  
		// affiche infobulle
		afficheInfobulleProjet(this,e);
		
		// couche
		$(this).css('zIndex',10);	  
	
		// zoom
		$(zoomObject).stop(true,true);
		$(this).animate({ 
			width: zoomF*wImg,
			height: zoomF*wImg,
			marginLeft: marginImg - zoomF*wImg/2 + wInImg/2,
			marginTop: marginImg - zoomF*hImg/2 +hInImg/2
			}, zoomSpeed);

		zoomObject = this;
	},
	function(e){
		// OUT
		// masque infobulle
		masqueInfobulleProjet(this,e);
		
		// dezoom
		$(zoomObject).stop(true,true);
		$(this).animate({ 
			width: wInImg,
			height: hInImg,
			marginLeft: marginImg,
			marginTop: marginImg
			}, zoomSpeed,'',function(){$(this).css('zIndex',5);

		zoomObject = this;
	});
});
ps.mousemove(bougeInfobulle);

// effet de click
ps.click(afficheDiaporama);


/*=================================================================================*/
});
/*********************/
/* CONTROLEURS       */
/*********************/
function placeProjets(placement)
{
	// degroupage eventuel
	detruitGroupes();
	// ferme les liens de groupes
	$('.groupsLinks').hide('slow');	
	
//	alert(placement);
	ps.each(function(i){
		//alert(this);
		//alert(tripsi[i]);
		perm_i = tripsi[i];
		var pc = (perm_i/nbps);
		this.style.zIndex = 5 + perm_i;
		placeProjet(this,pc,placement);
	});
	placementCourant = placement;
	AddLayoutsMove();
}
function placeInlineProjetsVisible(placement)
{
	
	// recup height h2 res recherche pour placement dessous
	var H2Height = $("#labelResRecherche").outerHeight(true);
	//alert(H2Height);
//	alert(placement);
	var psVisibles = $("#minix img:visible");
	var nbpsVisibles = psVisibles.size();
	psVisibles.each(function(i){
		//alert(this);
		//alert(tripsi[i]);
		if($(this).is(':visible'))
		{
			//perm_i = tripsi[i];
			//var pc = (perm_i/nbpsVisibles);
			var pc = (i/nbpsVisibles);

			$(this).animate({
				left: (i%nbpsw)*wImg,
				top: parseInt(i/nbpsw)*hImg + H2Height
			}, duree+pc*retard);

		}
	});
	//placementCourant = placement;
	
	
}

function placeProjet(oImg,pos,placement)
{
	var functionPlacement = eval("place_"+placement);
	functionPlacement(oImg,pos);
}

function chercheProjets(text)
{	
	var hasNoText = function(index){ 
		var posTitle = psinfos[index].title.toLowerCase().indexOf(text.toLowerCase());
		var posWeb = psinfos[index].web.toLowerCase().indexOf(text.toLowerCase());
	//var posCoWorker1 = psinfos[index]["co-worker"].toLowerCase().indexOf(text.toLowerCase());
		var posPhoto = psinfos[index]["photo"].toLowerCase().indexOf(text.toLowerCase());
		var posIllus = psinfos[index]["illus"].toLowerCase().indexOf(text.toLowerCase());
		var posOrga = psinfos[index]["orga"].toLowerCase().indexOf(text.toLowerCase());
		var posWebdev = psinfos[index]["webdev"].toLowerCase().indexOf(text.toLowerCase());
		var posText = psinfos[index]["text"].toLowerCase().indexOf(text.toLowerCase());
		var pos3d = psinfos[index]["3d"].toLowerCase().indexOf(text.toLowerCase());
		var posBusiness = psinfos[index]["business"].toLowerCase().indexOf(text.toLowerCase());
		var posAdvertiser = psinfos[index].advertiser.toLowerCase().indexOf(text.toLowerCase());
		var posAnnee = psinfos[index].annee.toLowerCase().indexOf(text.toLowerCase());
		var posDescription = psinfos[index].description.toLowerCase().indexOf(text.toLowerCase());
		var posCity = psinfos[index].city.toLowerCase().indexOf(text.toLowerCase());

//		alert(text.toLowerCase());
//		alert(psinfos[index].annee);
//		var isAnnee = (psinfos[index].annee == text.toLowerCase());
		return ((posTitle == -1) &&  (posWeb == -1) && (posText == -1) && (posWebdev == -1) && (pos3d == -1) && (posIllus == -1) && (posOrga == -1) && (posPhoto == -1)  && (posAdvertiser == -1) && (posAnnee == -1) && (posDescription == -1)&& (posCity == -1) && (posBusiness == -1)) ;
	};
	
	var hasText = function(index){ 
		return !hasNoText(index);
	};
	
	var nbHide = ps.filter(hasNoText).hide(duree).size();
	
	$("#nbResSearch").fadeOut('normal',function(){
		$(this).html(nbps - nbHide);
		$(this).fadeIn('normal');
	});

	// degroupage eventuel
	detruitGroupes();
	
	// titre H2 res de recherche 
	$("<h2 id='labelResRecherche'>").html((nbps - nbHide)+" results for \""+text+"\"").appendTo($("#minix"));


	ps.filter(hasText).show();
	
	setTimeout("placeInlineProjetsVisible('inline');",duree*1.1);
	
	// ferme les liens de groupes
	$('.groupsLinks').hide('slow');

}
function montreProjets()
{
	// ferme les liens de groupes
	$('.groupsLinks').hide();
	$("#nbResSearch").html(nbps);
	
	/*
	//var placeCalled = false;
	var placeCall = function(){
		if(!this.placeCalled)					
			placeProjets(placementCourant);
		this.placeCalled = true;
	};
	placeCall.placeCalled = false;
	ps.show("slow",placeCall);
	*/
	ps.show("fast");
//	placeProjets(placementCourant);
	setTimeout("placeProjets(placementCourant)",500);

}

/**************************/
/* FONCTIONS DE TRIS */
/**************************/
function triAucun()
{
	for(var i = 0;i<nbps;i++)
		tripsi[i] = i;
		
	$('#sorting_info').html('chronologic');
	placeProjets(placementCourant);	
}

function triReverse()
{
	for(var i = 0;i<nbps;i++)
		tripsi[i] = nbps-tripsi[i]-1;
	$('#sorting_info').html('reverse');
	placeProjets(placementCourant);
}

function triRandom(puissance)
{
	if(!puissance)
		puissance = puissanceMelangeRandom;

	var copie,i,j,k;
	// 3 fois plus d'échange aléatoires que de projets
	for(var k = 0;k<puissance*nbps;k++)
	{
		i = parseInt(Math.random()*nbps);
		j = parseInt(Math.random()*nbps);
		
		copie = tripsi[i];
		tripsi[i] = tripsi[j];
		tripsi[j] = copie;
	}
	$('#sorting_info').html('random');
	placeProjets(placementCourant);
}

function triRainbow()
{
	psColors = new Array(nbps)
	for(var i = 0 ; i < nbps ; i++)
	{
		psColors[i] = {orig : i , color : psinfos[i].color};
//		ps[i].title = parseInt(psinfos[i].color.substr(1,6),16);
	}
	
	// tri par couleur
	var comparePsColor = function(p1,p2){return compareHexColor(p1.color,p2.color);};
	psColors.sort(comparePsColor);

	// recup de la permutation
	for(var i = 0 ; i < nbps ; i++)
		tripsi[psColors[i].orig] = i;

	$('#sorting_info').html('rainbow');
	
	placeProjets(placementCourant);
}

function triBrightness()
{
	psColors = new Array(nbps)
	for(var i = 0 ; i < nbps ; i++)
	{
		var red = parseInt(psinfos[i].color.substr(1,2),16);
		var green = parseInt(psinfos[i].color.substr(3,2),16);
		var blue = parseInt(psinfos[i].color.substr(5,2),16);
		
		var rangColor = red*red + green*green + blue*blue;
		psColors[i] = {orig : i , color : psinfos[i].color, rgColor : rangColor};
		//ps[i].title = rangColor; // TO REMOVE
	}
	// tri par couleur
	var comparePsColor = function(p1,p2){return p2.rgColor - p1.rgColor;};
	psColors.sort(comparePsColor);

	// recup de la permutation
	for(var i = 0 ; i < nbps ; i++)
		tripsi[psColors[i].orig] = i;
	
	$('#sorting_info').html('brightness');
	placeProjets(placementCourant);
}


function triColorComp(comp)
{
	psColors = new Array(nbps)
	for(var i = 0 ; i < nbps ; i++)
	{
		if(comp == 'red') pos = 1;
		if(comp == 'green') pos = 3;
		if(comp == 'blue') pos = 5;
		
		goodComp = parseInt(psinfos[i].color.substr(pos,2),16);
		rangColor = (256-goodComp);
		
		psColors[i] = {orig : i , color : psinfos[i].color, rgColor : rangColor};
		//ps[i].title = rangColor; // TO REMOVE
	}
	// tri par couleur
	var comparePsColor = function(p1,p2){return p1.rgColor - p2.rgColor;};
	psColors.sort(comparePsColor);

	// recup de la permutation
	for(var i = 0 ; i < nbps ; i++)
		tripsi[psColors[i].orig] = i;

	$('#sorting_info').html('color '+comp);
	placeProjets(placementCourant);
}
function triHue()
{
	psColors = new Array(nbps)
	for(var i = 0 ; i < nbps ; i++)
	{
		var red = parseInt(psinfos[i].color.substr(1,2),16)/255;
		var green = parseInt(psinfos[i].color.substr(3,2),16)/255;
		var blue = parseInt(psinfos[i].color.substr(5,2),16)/255;
		
		var maxComp = Math.max(red,Math.max(green,blue));
		var minComp = Math.min(red,Math.min(green,blue));

		var hue;
		if(maxComp == minComp)
			hue = 0;
		else if(maxComp == red)
			hue = (60*((green-blue)/(maxComp-minComp))+360)%360;
		else if(maxComp == green)
			hue = (60*((blue-red)/(maxComp-minComp))+120);
		else if(maxComp == blue)
			hue = (60*((red-green)/(maxComp-minComp))+240);
						
		var rangColor = hue;
		psColors[i] = {orig : i , color : psinfos[i].color, rgColor : rangColor};
	}
	// tri par couleur
	var comparePsColor = function(p1,p2){return p2.rgColor - p1.rgColor;};
	psColors.sort(comparePsColor);

	// recup de la permutation
	for(var i = 0 ; i < nbps ; i++)
		tripsi[psColors[i].orig] = i;
	
	$('#sorting_info').html('chromatic');
	placeProjets(placementCourant);
}


/**************************/
/* FONCTIONS DE PLACEMENT */
/**************************/
function place_depart(oImg,pos)
{
	place_inline(oImg,pos);
}

function place_inline(oImg,pos)
{
	var rng = Math.round(pos*nbps);
	$(oImg).animate({ 
		left: (rng%nbpsw)*wImg,
		top: parseInt(rng/nbpsw)*hImg
	  }, duree+pos*retard);
}

function place_diagonale(oImg,pos)
{
	$(oImg).animate({ 
		left:(wCont-wImg)*(1-pos),
		top: wCont/2*pos
	  }, duree+pos*retard);
}

function place_cercle(oImg,pos)
{
	$(oImg).animate({ 
		left:x0 + rmax*Math.cos(2*Math.PI*pos),
		top: y0 + rmax*Math.sin(2*Math.PI*pos)
	  }, duree+pos*retard);
}

function place_spirale(oImg,pos)
{
	$(oImg).animate({ 
		left:x0 + rmax*pos*Math.cos(nbTours*2*Math.PI*pos),
		top: y0 + rmax*pos*Math.sin(nbTours*2*Math.PI*pos)
	  }, duree+pos*retard);
}

function place_onde(oImg,pos,amplifiee)
{
	if(!amplifiee)
	{
		posH = 0.3;
		decal = 200;
	}
	else
	{
		posH = pos;
		decal = 0;
	}
	$(oImg).animate({ 
		left:(wCont-wImg)*(1-pos),
		top: y0 - decal + rmax*(posH)*Math.sin(nbTours*2*Math.PI*(pos))
	  }, duree+pos*retard);
}

function place_onde_amplifiee(oImg,pos)
{
	place_onde(oImg,pos,true);
}

function place_coeur(oImg,pos)
{
	var t = 1 - pos*2;
	t = t * t;
	if(pos > 0.5)
		t = -t;			
	
	//oImg.title = pos;			

	var xImg = x0 + 2.4*rmax*Math.cos(t)*Math.sin(t)*Math.log(Math.abs(t));//pos*Math.cos(nbTours*2*Math.PI*pos),
	var yImg = y0 + 65 - 2.2*rmax*Math.sqrt(Math.abs(t))*Math.cos(t);//pos*Math.cos(nbTours*Math.PI*pos);
	if(pos == 0.5) 
		xImg = x0;
		
	$(oImg).animate({
		left:xImg,
		top:yImg 
	  }, duree+pos*retard);
}


/**************************/
/* FONCTIONS DE GROUPES */
/**************************/
function compareGroupes(g1,g2)
{
	if(g1.nom < g2.nom)
		return -1;
	else if(g1.nom == g2.nom)
		return 0;
	else
		return 1;

}
function groupeCol(colonne,filtresUlConteneur)
{
	//alert(colonne);	
	//alert(colonne + ' : ' + eval("psinfos[0]."+colonne));
	//alert(labelGroupe);
	//alert(filtresUlConteneur);
	
	$('.groupsLinks').hide('slow');

	if(filtresUlConteneur && $(filtresUlConteneur).is(":visible")) //referme filtres conteneur et c tout
		return;
		
	if(colonne == 'annee')		
		$('#grouping_info').html("years");
	else
		$('#grouping_info').html(colonne);
	
	/* CREATION DES GROUPES */
	var nbg = 0;
	var nomGroupes = new Array(); // juste pour vérifier l'xexistance d'un groupe avec inArray sur le nom
//	var psGroupes = new Array();
	Groupes = new Array();
	

	//for(var prop in psinfos[0])
	//alert((psinfos[0]['date']));
	//alert(reverseDate(psinfos[0]['date']));
	//alert(formatDate(psinfos[0]['date']));
	
	for(var i = 0; i < nbps;i++)
	{
		var valCol; 
		if(colonne == "coworker")
		{
			valCol = psinfos[i]['co-worker'];
		}
		else
		{
			valCol = psinfos[i][colonne];
//			if(colonne == 'selection' && valCol=='0')
//				continue;
			if(colonne == 'selection') 
				valCol = (valCol=='1'?'Selected':'Not Selected');
		}
		if(valCol=="")
			valCol = "Unknown";
		
		var posGroup = jQuery.inArray(valCol, nomGroupes);	
		if(posGroup == -1)
		{
			nomGroupes[nbg]	= valCol;
			//psGroupes[nbg]	= new Array();
			posGroup = nbg;

			Groupes[posGroup] = {nom:valCol,ps:(new Array())};
			nbg++;
		}
		//psGroupes[posGroup].push(ps[i]);
		Groupes[posGroup].ps.push(ps[i]);
	}		
	
	/* TRI DES GROUPES */
	Groupes.sort(compareGroupes);
	// tri inverse pour certaines colonnes
	if(colonne == "annee" || colonne == "selection")
		Groupes.reverse();

/*
	// LABEL TYPE DE GROUPES 
	$('#groupsDiv h4').fadeOut('normal',function(){
		$(this).html(labelGroupe + ' Groups');									   
		$(this).fadeIn('normal');									   		
	});
*/	
	/* AJOUTE TITRES DE GROUPE */
	// efface anciens titres
	$('#minix h2').remove();

	// affiche tous les projets
	ps.show();

	// placement courant pour projet et titres
	var curX = 0;
	var curY = 0;
///	for(var k = 0; k < nomGroupes.length; k++)
	for(var k = 0; k < Groupes.length; k++)
	{
		if(Groupes[k].nom == "Not Selected")
		{
			$(Groupes[k].ps).hide('fast');
			continue;
		}
///		var nbpsInG = psGroupes[k].length;
		var nbpsInG = Groupes[k].ps.length;
		// creation du titre
///		var titreGroupe = '<h2 title="'+nomGroupes[k]+'" >'+nomGroupes[k]+'  ('+ nbpsInG +')</h2>';

		var titreGroupe = '<h2 title="'+Groupes[k].nom+'" >'+Groupes[k].nom+'  ('+ nbpsInG +') &gt;</h2>';
		var firstProjetI = Groupes[k].ps[0].alt;
//		firstProjetI;
		var oH2 = $(titreGroupe).css('cursor','pointer').attr('lang',firstProjetI).click(function(){afficheDiaporamaFromTitreH2(this.lang);});
		var hH2 = 19;// '19px' : a calculer selon CSS;
		//alert(hH2);
		oH2.hide().css({left:curX,top:curY});
		$('#minix').append(oH2);	
		curY += hH2 + 15; // 15px de marge sous le titre du groupe
		
		//alert(psGroupes[k][0]);
		for(var i = 0;i < nbpsInG;i++)
		{
///			$(psGroupes[k][i]).animate({left:curX,top: curY}, duree);
			$(Groupes[k].ps[i]).animate({left:curX,top: curY}, duree);
			Groupes[k].ps[i].groupe = Groupes[k].nom;
			Groupes[k].ps[i].groupeIndex = k;

			curX += wImg;
			if((i%nbpsw == (nbpsw-1)) && (i != (nbpsInG-1)))
			{
				curY += hImg;
				curX = 0;
			}
		}
		
		curX = 0;
		curY += hImg; // 20px de marge sous les projets de ce groupe
	}
	// apparition des titres
	$('#minix h2').show('slow');



	/* LIENS DE FILTRAGE PAR GROUPE */
	if(filtresUlConteneur)
	{
		//$(filtresUlConteneur).empty();
		//alert($(filtresUlConteneur).html());
		if($(filtresUlConteneur).html().toLowerCase() == "<li></li>")
		{
			/* POUR CHAQUE GROUPE */
			for(var k = 0; k < Groupes.length; k++)
			{
				if(Groupes[k].nom != "Not Selected")
					$(filtresUlConteneur).append($("<li>"+Groupes[k].nom+" ("+Groupes[k].ps.length+")</li>").attr('title',Groupes[k].nom).click(function(){filtreGroupe(this.title,colonne);}));			
			}
		}
		//alert(filtresUlConteneur);
		$(filtresUlConteneur).show('slow');									   
	}
	groupementCourant = colonne;
	AddLayoutsMove();

}

function filtreGroupe(nomGroupe,typeGroupe)
{
	// si pas de groupe, on les cree
	if(Groupes.length == 0)
		groupeCol(typeGroupe);
	
	nomGroupe = nomGroupe.replace("&amp;","&");
	
	$('#current_group_info').html(nomGroupe);
	
	if(groupementCourant=='coworker') groupementCourant='co-worker';
	var nomGroupeSQL = nomGroupe;
	if(nomGroupe=="Unknown") nomGroupeSQL="";
	if(groupementCourant=='selection' && nomGroupe=="Selected") nomGroupeSQL=1;
	if(groupementCourant=='selection' && nomGroupe=="Not Selected") nomGroupeSQL=0;
			
	var IsValCol = function(index){ 
		var curGroupe = psinfos[index][groupementCourant].replace("&amp;","&");
		var res = (curGroupe==nomGroupeSQL);
		return res;
	};
	
	var IsNotValCol = function(index){ 
		//var res = (psinfos[index][groupementCourant]!=nomGroupe);
		return !IsValCol(index);
	};
	
	/* CACHE LES PROJETS */
	var nbHide = ps.filter(IsNotValCol).hide(duree).size();
	//alert(nbHide);
	$("#nbResSearch").fadeOut('normal',function(){
		$(this).html(nbps - nbHide);
		$(this).fadeIn('normal');
	});
	
	/* CACHE LES TITRES */
	
	var IsTitleVal = function(index){ 
		//alert(this.title+" == "+nomGroupe);
		var res = (this.title == nomGroupe);
		return res;
	};
	var IsNotTitleVal = function(index){ 
		var res = (this.title != nomGroupe);
		return res;
	};
	
	$('#minix h2').filter(IsNotTitleVal).fadeOut('slow');
	
	/* REMONTE ET AFFICHE LE BON TITRE */
	var hMove = parseInt($('#minix h2').filter(IsTitleVal).fadeIn('slow').animate({top:0},'fast').css('top'));
	
	/* REMONTE ET MONTRE LES BONS PROJETS */
	ps.filter(IsValCol).show(duree).each(function(i){
		var newY = parseInt($(this).css('top')) - hMove;
		$(this).animate({top:newY},'fast');
	});
	
	AddLayoutsMove();
}

function detruitGroupes()
{
	// efface anciens titres
	$('#minix h2').remove();
	Groupes = new Array();
	groupementCourant = false;
}

function AddLayoutsMove()
{
	nbClickLayouts++;
	$("span.click_compteur").html(nbClickLayouts);
	createCookie("moves_compteur",nbClickLayouts,365); // cookie de sauvegarde du compteur de moves, valable 1 an
}

