//-------------------------------------------------
var do_log = 1;
function CLog( mess )
{
	if( typeof(console) != 'undefined' && do_log )
		console.log( mess );
}

//-------------------------------------------------
var reg_empty = new RegExp("^\s*$","g");
function Is_Empty( str )
{
	return reg_empty.test( str );
}

//-------------------------------------------------
var reg_RegExSpecialsChars = new RegExp( "([\(\)\{\}\\\\*\+\?\=\:\!\^\$\.])","g");
function Escape_Regex_Chars( s )
{
	return s.replace( reg_RegExSpecialsChars, "\\$1" );
}



/* -------------------------------------------------------------------------------
								URLS ET VARIABLES DE REQUETES
   ------------------------------------------------------------------------------- */

//-------------------------------------------------
function Get_Site_Base_Url()
{
	var basepath = window.location.pathname;

	var res = "";
	var regex = new RegExp( "\/([^\/]+)", "i" );
	var regex_res = regex.exec( basepath );
	
	var subdir = "";
	if( regex_res.length >= 2 )
	{
		// Si le bloc de texte ne contient pas de '.' c'est que c'est un sous rÃ©pertoire
		if( regex_res[1].indexOf(".") < 0 )
			subdir = regex_res[1];
	}
	
		
	return window.location.protocol + "//" + window.location.hostname + ( window.location.port ? ":" + window.location.port : "" ) + "/" + subdir;
}

//---------------------------------------------
function getUriForAddingVar()
{
	_uri = window.location.href;
	if( _uri.indexOf("#") != -1 )
		_uri = _uri.substring(0, _uri.indexOf("#"));

	if( _uri.indexOf("?") == -1 )
		_uri += "?";
	else
		_uri += '&';
	return _uri;
}

//---------------------------------------------
function Get_Req_Param( key, def_val )
{
	var v = $(document).getUrlParam(key);
	if( v )
		return v;
	else
		return def_val;
}

//---------------------------------------------
function decodeQueryParam( p )
{
	p = decodeURIComponent( p );
	return p.replace("+", " ");
}





/* -------------------------------------------------------------------------------
								TRIS
   ------------------------------------------------------------------------------- */

//---------------------------------------------
function ANN__Tri_Rapide( arr, l, f_access, f_comp, premier, dernier, b_inverse )
{
	if( premier < dernier )
	{
		var pivot = premier;
		
		// partitionnement
		{
			var t = arr[pivot];
			arr[pivot] = arr[dernier];
			arr[dernier] = t;
			
			var j = premier;
			for( i = premier; i < dernier; i++ )
			{
				var res_cmp = f_comp( f_access( l, arr[i] ), f_access( l, arr[dernier]) );
				if(     (b_inverse == false && res_cmp < 0 )
					||	(b_inverse == true  && res_cmp > 0 )
					)
				{
					var t = arr[i];
					arr[i] = arr[j];
					arr[j] = t;
					j++;
				}
			}
			
			t = arr[j];
			arr[j] = arr[dernier];
			arr[dernier] = t;
			
			pivot = j;
		}
		
		ANN__Tri_Rapide( arr, l, f_access, f_comp, premier, pivot-1, b_inverse );
		ANN__Tri_Rapide( arr, l, f_access, f_comp, pivot+1 ,dernier, b_inverse );
	}
}


//---------------------------------------------
function Tri_Rapide( l, f_access, f_comp, nb_elts, b_inverse )
{
	var premier = 0;
	var arr = [];
	for( i = 0; i < nb_elts; i++ )
		arr[i] = i;
	
	ANN__Tri_Rapide( arr, l, f_access, f_comp, 0, nb_elts - 1, b_inverse );
	
	return arr;
}

//---------------------------------------------
function j_access( l_dom, ind )
{
	return l_dom.eq(ind);
}

//---------------------------------------------
function ANN__sort_table( dom, num_col, f_comp )
{
	//------------------------------
	// RÃ©cupÃ©ration des trs de la table parente
	var l_dom_table = dom.closest("table");
	if( l_dom_table.size() == 0 )
	{
		alert("sort_table__str() : no parent table found !" )
		return;
	}
	
	var dom_table = l_dom_table.eq(0);
	
	var l_dom_tr = dom_table.children( "tr" );
	if( l_dom_tr.size() == 0 )
		l_dom_tr = dom_table.children().children("tr");
	if( l_dom_tr.size() == 0 )
	{
		alert("sort_table__str() : no 'tr' table found !" )
		return;
	}
	
	// il faut exclure du tri le premier tr s'il contient des th
	var ind_start = 0;
	if( l_dom_tr.eq(0).children("th").size() > 0 )
		ind_start = 1;
		
	//------------------------------
	// On rassemble les dom de tri
	var l_dom_tri = jQuery();
	l_dom_tr.each(
				function( ind)
				{
					if( ind < ind_start )
						return;
					
					var l_dom_tds = l_dom_tr.eq(ind).children( "td" );
					if( l_dom_tds.size() <= num_col )
					{
						alert( "ANN__sort_table() : too less TDs with num_col = " + num_col + "  and l_dom_tds.size() = " + l_dom_tds.size() );
						return;
					}
					l_dom_tri = l_dom_tri.add( l_dom_tds.eq( num_col ) );
//					CLog( "l_dom_tri.size() = " + l_dom_tri.size() );
				}
			);

	var nb_elts = l_dom_tri.size();
	if( nb_elts <= 1 )
		return;
	CLog( "Nombre de lignes : " + nb_elts );
	
	var prev_cursor = document.body.style.cursor;
	document.body.style.cursor = "wait";
	
	//------------------------------
	// Execution du tri
	var arr_new_order = Tri_Rapide( l_dom_tri, j_access, f_comp, nb_elts, false );
	
	//------------------------------
	// VÃ©rifie qu'il y a eu un changement
	var b_inverse = true;
	for( var i = 0; i < nb_elts; i++ )
		if(arr_new_order[i] != i )
		{
			b_inverse = false;
			break;
		}
	
	// S'il n'y a pas eu de changement	=> on tri dans le sens inverse
	if( b_inverse == true )
	{
		arr_new_order = Tri_Rapide( l_dom_tri, j_access, f_comp, nb_elts, true );
	}
	
	//------------------------------
	// Mise en place du nouvel ordre
	
	var dom_curr;
//	CLog( "dom_table(tr).size = " + dom_table.find( "tr" ).size() );
	
	if( arr_new_order[0] == 0 )
		dom_curr= l_dom_tri.eq(0).parent();
	else
	{
		var dom_to_move = l_dom_tri.eq(arr_new_order[0]).parent();
		dom_to_move = dom_to_move.detach();
		l_dom_tri.eq(0).parent().before( dom_to_move );
		dom_curr = l_dom_tri.eq(0).parent().prev();
	}
	
//	CLog( "dom_table(tr).size = " + dom_table.find( "tr" ).size() );

	for( var i = 1; i < nb_elts; i++ )
	{
//		CLog( "Moving " + i + " to " + arr_new_order[i] );
		var dom_to_move = l_dom_tri.eq(arr_new_order[i]).parent();
		dom_to_move = dom_to_move.detach();
		dom_curr.after( dom_to_move );
		dom_curr = dom_curr.next();
	}
	
	document.body.style.cursor = prev_cursor;
}


//---------------------------------------------
function str_comp( dom_s0, dom_s1 )
{
	var s0 = dom_s0.text();
	var s1 = dom_s1.text();
	
	if( s0 < s1)
		return -1;
	if( s0 > s1 )
		return 1;
	return 0;
}

//---------------------------------------------
function sort_table__str( dom_th, num_col )
{
	return ANN__sort_table( dom_th, num_col, str_comp );
}

//---------------------------------------------
function p_date_parse( str_date )
{
	var arr = str_date.split( "\/" );
	var d = new Date( parseInt(arr[2]), parseInt(arr[1]), parseInt(arr[0]) );
//	CLog( "p_date_parse( " + str_date + ") => " + d );
	return d;
}

//---------------------------------------------
function date_comp( dom_s0, dom_s1 )
{
	var d0 = p_date_parse( dom_s0.text() );
	var d1 = p_date_parse( dom_s1.text() );
	
	if( d0 < d1)
		return -1;
	if( d0 > d1 )
		return 1;
	return 0;
}

//---------------------------------------------
function sort_table__date( dom_th, num_col )
{
	return ANN__sort_table( dom_th, num_col, date_comp );
}


/* -------------------------------------------------------------------------------
				POP-DOWN HIDDABLES
   ------------------------------------------------------------------------------- */
//---------------------------------------------
function enable_Std_Hiddables()
{
	var l_hidders = $("body .hidder_std");
	l_hidders.click(
				function()
				{
					var next = $(this).next();
					var css_display = next.css("display");
					if( css_display == "none" )
					{
						css_display = $(this).attr("prev_display");
						if( ! css_display )
							css_display = "block";
						next.css("display", css_display);
					}
					else
					{
						$(this).attr( "prev_display", css_display );
						next.css( "display", "none");
					}
				}
			)
}

//---------------------------------------------
function enable_Std_Hiddables_childs( dom_elt )
{
	var l_hidders = dom_elt.find(".hidder_std");
	l_hidders.click(
				function()
				{
					var next = $(this).next();
					var css_display = next.css("display");
					if( css_display == "none" )
					{
						css_display = $(this).attr("prev_display");
						if( ! css_display )
							css_display = "block";
						next.css("display", css_display);
					}
					else
					{
						$(this).attr( "prev_display", css_display );
						next.css( "display", "none");
					}
				}
			)
}

//---------------------------------------------
function Do_Pop_Down( dom_starter, dom_pop_down )
{
	var dom_pop_root = dom_starter.closest(".root_Pop_Down");
	
	if( dom_pop_down.size() > 0 )
	{
		if( dom_pop_down.css("display") == "none")
		{
			var dom_prev_pop_down = dom_pop_root.attr("prev_pop_down");
			if( dom_prev_pop_down )
			{
				dom_pop_root.find(".pop_down").css("display", "none");
			}
			
			dom_pop_down.css("display", "block" );
			dom_pop_root.attr("prev_pop_down", dom_pop_down );
		}
		else
		{
			dom_pop_down.css("display", "none" );
			dom_pop_root.removeattr( "prev_pop_down" );
		}
	}
}

//---------------------------------------------
function Assign_Delete_Confirmations( dom_root, delete_class )
{
	dom_root.find("." + delete_class ).click( 
				function()
				{
					return confirm("Etes-vous certain de vouloir supprimer cet Ã©lÃ©ment ?");
				}
			);
}

/* -------------------------------------------------------------------------------
				FONCTIONS RELATIVES AUX COOKIES
   ------------------------------------------------------------------------------- */
function Cookie__Add( key, val )
{
	$.cookie(key, val, {path: '/'});
}

function Cookie__Remove( key )
{
	$.cookie(key, null, {path: '/'});
}

function Cookie__Get( key )
{
	return $.cookie( key );
}


/* -------------------------------------------------------------------------------
				FONCTIONS RELATIVES A LA COLORISATION DE LA RECHERCHE
   ------------------------------------------------------------------------------- */
function Search_Text__Remove()
{
	Cookie__Remove( "search_regex" );
}

function Search_Text__Get_Regex()
{
	return Cookie__Get( "search_regex" );
}

function Format_Search_Match( s )
{
	s = Escape_Regex_Chars( s );
	s = s.replace( /[éèêë]/gi, "[éèêëe]" );
	s = s.replace( /[àäâáã]/gi, "[àäâáãa]" );
	s = s.replace( /[îïíì]/gi, "[îïíìi]" );
	s = s.replace( /[ôöó]/gi, "[ôöóo]" );
	s = s.replace( /[ûüùú]/gi, "[ûüùúu]" );
	s = s.replace( /[ÿ]/gi, "[ÿy]" );
	s = s.replace( /[ñ]/gi, "[ñn]" );
	s = s.replace( /[ç]/gi, "[çc]" );
	
	return s;
}

//----------------------------------------------------------
function Search_Text__May_Register_New_Regex( search_text, b_exact_expr )
{
	if( Is_Empty( search_text ) )
	{
		Search_Text__Remove();
		return;
	}
	
	var arr_expr;
	if( b_exact_expr )
		arr_expr = new Array( search_text );
		
	else
	{
		arr_expr = search_text.split( /\s+/ );
	}
	
	if( arr_expr.length == 0 )
	{
		alert( "ERROR\nSearch_Text__May_Register_New_Regex()\narr_expr.length == 0 " );
		Search_Text__Remove();
		return;
	}
	
	// There's no lookbehind possibilities in javascript
	var s_colorize_regex_match = "(";
	for( var i = 0; i < arr_expr.length; i++ )
	{
		s_colorize_regex_match += "(?:" + Format_Search_Match( arr_expr[i] ) + ")|";
	}
	
	// On enlÃ¨ve le '|' de fin et on cloture la regex avec un lookahead
	s_colorize_regex_match = s_colorize_regex_match.substr( 0, s_colorize_regex_match.length -1 ) + ")";
	
	Cookie__Add( "search_regex", s_colorize_regex_match );
	CLog( "s_colorize_regex_match = '" + s_colorize_regex_match + "'" );
}

