function print_r(theObj){
  if(theObj.constructor == Array ||
     theObj.constructor == Object){
    document.write("<ul>")
    for(var p in theObj){
      if(theObj[p].constructor == Array||
         theObj[p].constructor == Object){
document.write("<li>["+p+"] => "+typeof(theObj)+"</li>");
        document.write("<ul>")
        print_r(theObj[p]);
        document.write("</ul>")
      } else {
document.write("<li>["+p+"] => "+theObj[p]+"</li>");
      }
    }
    document.write("</ul>")
  }
}

document.write('<script type="text/javascript" src="/admin/js/refresh_session.php"></scr' + 'ipt>'); 


/**/

// !!!!!!!!!!!!!!!!!!!!!!!!!!
// @require prototype.js
// @require scriptaculous.js
// !!!!!!!!!!!!!!!!!!!!!!!!!!

/**
 * ###########################################################
 * ##### Loading : Classe pour afficher et cacher une zone de loading
 * ###########################################################
 */
var Loading = Class.create();

/*
 * Affiche la zone de loading
 * @param elementId identifiant de l'élément qui contiendra la zone de loading
 */
Loading.show = function(elementId,text){
	if(text==null)
		text='&nbsp;';
	var loading_element = '<div id="loading_'+elementId+'" class="loading">'+text+'</div><div class="spacer"></div>';
	new Insertion.Top(elementId,loading_element);
};

/*
 * Cache la zone de loading
 * @param elementId identifiant de l'élément qui contient la zone de loading
 */
Loading.hide = function(elementId){
	if($('loading_'+elementId)!=null)
		Element.remove($('loading_'+elementId));
};

/**
 * #############################################
 * ##### Date Classe pour des opérations sur des données de table (ex : suppression de ligne)
 * #############################################
 */

var GI2Date = Class.create();

/**
 * Prend une date au format sql en entrée et ressort la date en format texte lisible
 */
GI2Date.dateTexte = function(date_sql){
	array_date = date_sql.split('-');
	if(array_date.length == 3){
		var jsdate = new Date(array_date[0],array_date[1]-1,array_date[2]);
		return jsdate.getDate()+'/'+(jsdate.getMonth()+1)+'/'+jsdate.getFullYear();
	}
	return '';
}

GI2Date.dateTimeTexte = function(time_sql){
	array_time = time_sql.split(' ');
	return GI2Date.dateTexte(array_time[0])+" à "+array_time[1];
}

Array.in_array = function(search_value,research_array){
	if(research_array==null)
		return true;
	for (var i = 0; i < research_array.length; i++) {
      if (research_array[i] === search_value) {
         return true;
      }
   }
   return false;
}

// Fonction pour échapper les apostrophes en javascript
String.prototype.stripSlashes = function(){
	return  this.replace(/\\/g, '');
}

String.prototype.addSlashes = function(){
	var str = this.replace(/\'/g,'\\\'');
	/*str = str.replace(/\"/g,'\\"');
	str = str.replace(/\\/g,'\\\\');
	str = str.replace(/\0/g,'\\0');*/
	return str;
}

/**
 * ###########################################################
 * ##### Calendar : Classe pour afficher et cacher une zone de loading
 * ###########################################################
 */
 
var Calendar = Class.create();
 
 /*
  * Ouvre une fenetre de calendrier dont la date choisie sera affichée dans le champ field
  * @param string field l'identifiant du champ recevant la date choisie
  * @param string le chemin absolu de l'interface d'admin de gi2
  */ 
 Calendar.open = function(field,gi2_admin_path){
	var newWindow;
	if(gi2_admin_path==null)
		gi2_admin_path='/admin';
	var urlstring = gi2_admin_path+'/inc/libs/ext/datepicker/calendar.php?champ='+field;
	Popup.open(urlstring,'date','232','200','no','center');
}

datepicker = function(field){
	Calendar.open(field);
}

var ColorPicker = Class.create();

ColorPicker.open = function(field,gi2_admin_path){
	var newWindow;
	var urlstring = gi2_admin_path+'/inc/libs/ext/colorpicker/colorpicker.php?field='+field;
	Popup.open(urlstring,'colorpicker','232','232','no','center');
}

/**
 * ###########################################################
 * ##### Popup : Classe pour afficher une popup
 * ###########################################################
 */
var Popup = Class.create();

/* 
 * Ouvre une fenetre popup
 * 
 * @param url string l'url à ouvrir
 * @param name le nom de la popup
 * @param w int la largeur de la popup
 * @param h la hauteur de la popup
 * @param scroll yes | no
 * @param pos string center | random | null
*/
Popup.open = function(url,title,w,h,scroll,pos,resizable){
	if(pos=="random"){
		LeftPosition=(screen.width)?Math.floor(Math.random()*(screen.width-w)):100;
		TopPosition=(screen.height)?Math.floor(Math.random()*((screen.height-h)-75)):100;
	}
	if(pos=="center"){
		LeftPosition=(screen.width)?(screen.width-w)/2:100;
		TopPosition=(screen.height)?(screen.height-h)/2:100;
	}
	else if((pos!="center" && pos!="random") || pos==null){
		LeftPosition=10;
		TopPosition=10;
	}
	if(resizable==null)
		resizable='no';
	settings='width='+w+',height='+h+',top='+TopPosition+',left='+LeftPosition+',scrollbars='+scroll+',location=no,directories=no,status=no,menubar=no,toolbar=no,resizable='+resizable;
	win = window.open(url,title,settings);
	return win;
}

/*
 * Ouvre une popup en plein écran
 * @param string url l'url contenue dans la popup
 * @param string title le titre de la fenetre popup
 */
Popup.openFullScreen = function(url,title){
	return Popup.open(url,title,window.screen.width,window.screen.height,'yes','','yes');
}

/**
 * ############################################################################
 * ##### Forms : Classe pour des opérations classiques javascript sur des formulaires
 * ############################################################################
 */
var Forms = Class.create();
/*
Coche ou décoche tous les éléments de type checkbox dans la zone d'identifiant elementId
* @param string l'identifiant de la zone dans laquelle on coche ou décoche
* @param bool indiquant si on doit tout cocher (true) ou tout décocher false
*/
Forms.checkAll = function(elementId,check){
	var inputs = $$('#'+elementId+" input");
	inputs.each(function(input){
		if(input.type=='checkbox')
			input.checked=check;
	});
}

Forms.validate = function(fields,msg){
	var no_errors = true;
	var fieldId;
	for (var i=0;i<fields.length;i++)
	{
		fieldId  = fields[i];
   		if($F(fieldId)=='' || $F(fieldId)==null){
   			if($(fieldId).className != 'required_field'){
	   			$(fieldId).className='required_field';
	   			new Insertion.After(fieldId,'<span id="error_'+fieldId+'" class="error">'+msg+'</span>');
   			}
   			no_errors = false;
   		}
   		else {
   			if($(fieldId).className == 'required_field'){
   				$(fieldId).className='';
   				$("error_"+fieldId).remove();
   			}
   		}
	}
	return no_errors;
}

/**
 * #################################################
 * ##### Message : Classe pour afficher des messages
 * #################################################
 */
var Message = Class.create();

/*
 * Affiche un message de succés dans une zone
 * @param string msg le message de succés
 * @param string container l'élément qui contiendra le message
 */
Message.showSuccess = function(msg,container){
	new Insertion.Top(container,'<div id="success_zone" class="success">'+msg.stripSlashes()+'</div>');
	Effect.Fade("success_zone",{duration:3,afterFinish:function(){
								//Effect.SwitchOff("success_zone");
							}
	});
}

/*
 * Affiche un message de confirmation avant de rediriger vers une url
 * @param string msg le message de confirmation
 * @param string url vers laquelle est redirigé le client si la confirmation est validée
 */
Message.confirmBefore = function(msg,url){
	if (confirm(msg))
		window.location=url;
}

/**
 * #############################################
 * ##### Table Classe pour des opérations sur des données de table (ex : suppression de ligne)
 * #############################################
 */
 
var Table = Class.create();

/*
 * Supprime une ligne d'une table
 * @param string le message validant la suppression
 * @param string script le script appellé pour gérer la suppression en base de donné (null si suppression surfacique)
 * @param string pars les paramètres du script (null si suppression surfacique)
 * @param string line_id l'identifiant de la ligne à supprimer
 */
Table.removeLine = function(msgRemove,script,pars,line_id){	
	Element.setStyle(line_id,{backgroundColor:"pink"});	
	if(confirm(msgRemove)){
		if(script!=null){
			var myAjax = new Ajax.Request(
			script, 
			{
				method: "get", 
				parameters: pars, 
				onComplete: function(originalRequest){
					var success = originalRequest.responseText;
					if(success==1){
						// Si reussite on supprime la ligne correspondante (evite le rafraichissement)
						Effect.Fade(line_id,{afterFinish:function(){
							Element.remove(line_id);
						}});					
					}
					else {
						// Si probleme, on affiche celui ci
						alert(success);
						// Reinitialisation du style
						Element.setStyle(line_id,{backgroundColor:""});
					}		
				}
			});
		}
		else {
			// Suppression surfacique
			Effect.Fade(line_id,{afterFinish:function(){
						Element.remove(line_id);
			}});
		}
	}
	else {
		// Si la confirmation n'est pas valide on remet le style par defaut
		Element.setStyle(line_id,{backgroundColor:""});	
	}
}

/**
 * #############################################
 * ##### Classe pour gérer le remplacement d'un élément affiché par un autre
 * #############################################
 */
var Gi2ShowInstead = Class.create();

Gi2ShowInstead.prototype = {
	
	initialize: function(element_to_show){
		this.show(element_to_show);
	},
	
	show : function(element_to_show){
		if(this.current_element!=null)
			Element.hide(this.current_element);
		if(element_to_show!=null && element_to_show!=''){
			Element.show(element_to_show);
			this.current_element = element_to_show;
		}
	}
}
 
String.encodeHTML = function(chaine){
	chaine = chaine.replace(/&/g,"&amp;");
	chaine = chaine.replace(/</g,"&lt;");
	chaine = chaine.replace(/>/g,"&gt;");
	return chaine;
}

String.decodeHTML = function(chaine){
	chaine = chaine.replace(/&amp;/g,"&");
	chaine = chaine.replace(/&lt;/g,"<");
	chaine = chaine.replace(/&gt;/g,">");
	return chaine;
}


