/**
 * Bibliothéque Javascript de base
 *
 * @version (voir einden.base.php)
 * @package einden
 * @access public
 * @author Arnaud Bour
 * @copyright EINDEN Studio - Tous droits réservés
 */ 

// Standardisation Javascript entre navigateurs
// ///////////////////////////////////////////////////
function DetectBrowser()
{
   // Généralité
   this.name=navigator.appName;	
   this.ver=navigator.appVersion;
   this.dom=document.getElementById?1:0;
   
   // Navigateur
   this.ie=(this.dom && navigator.appVersion.match(/MSIE (\d\.\d)/))?1:0;
   this.firefox=(this.dom && navigator.userAgent.toLowerCase().indexOf("firefox") != -1) ?1:0;
   
   // Type machine
   this.mac=(this.ver.toLowerCase().indexOf("macintosh") != -1);
   this.win=(this.ver.toLowerCase().indexOf("windows") != -1);
   
   // Fixe "this.ver"
   if(this.firefox)     { tbl=navigator.userAgent.split('/'); this.ver=parseFloat(tbl[tbl.length-1]); }
   else if(this.ie)     { tbl=navigator.userAgent.split(';'); tbl=tbl[1].split(' '); this.ver=parseFloat(tbl[tbl.length-1]); }
   
   this.scrollTop=function(idf)  { idf=(idf)?frames[idf].document:document; return (idf.documentElement.scrollTop)?idf.documentElement.scrollTop:idf.body.scrollTop; }
   this.scrollLeft=function(idf) { idf=(idf)?frames[idf].document:document; return (idf.documentElement.scrollLeft)?idf.documentElement.scrollLeft:idf.body.scrollLeft; }

   return this;
}
var bw=new DetectBrowser();

// Tous les clics permettent d'effacer les calques "actifs" (Anciennement à Richtext)
// ///////////////////////////////////////////////////
var RichText_Object=new Array();

// Constructeur pour les objets de RichText_Object[]
function ConstructObject(obj)
{
   this.css=document.getElementById(obj).style;
   this.obj = obj + "Object";
   eval(this.obj + "=this");
   return this
}

// Efface les calques "actifs"
function OnDocumentClick(e)
{
   var e = e || event || this.parentWindow.event; 
   var oTarget = e.srcElement || e.target;

   for(idf in RichText_Object)
   {
	   idframes=frames[idf];

       // Vérifie les exceptions
	   if(oTarget.id=="RichText_CalqueFrmStyleSheet"+idf ||		  
		  oTarget.id=="RichText_select_style" ||
		  oTarget.id=="RichText_select_module" ||
		  oTarget.id=="RichText_select_carac" ||
		  oTarget.id=="RichText_select_menu" ||
		  
		  oTarget.id=="colorPicker_plug" ||		  
		  oTarget.id=="colorPicker_big_current_color_box" ||
		  oTarget.id=="colorPicker_sv_box" ||
		  oTarget.id=="colorPicker_selectionner" ||
		  oTarget.id=="colorPicker_hue_slider" ||
		  oTarget.id=="colorPicker_saturation_value_slider" ||		  
		  oTarget.id=="colorPicker_hue_coul" ||
		  
		  oTarget.className=="RichText_Contextuel") return(0);

	   for(var y=1; y<7; y++)
		  for(var x=1; x<7; x++)
			 if(oTarget.id=="RichText_select_table"+String(y)+String(x)+'_'+idf) return (0);
	
	   // On efface les calques "actifs"
	   for(elm in RichText_Object[idf].calque)
		  if(typeof(window[elm])=='object' && window[elm].css.visibility=='visible' && oTarget.id!=window[elm]) { window[elm].css.visibility='hidden'; window[elm].css.zIndex=-1 }
   }  
}

// Initialise la mise sous surveillance du document dans sa globalité (hors des richtext)
function InitSurveillanceGlobal()
{ 
  if(bw.ie) document.attachEvent('onmousedown', OnDocumentClick);
  else document.addEventListener('mousedown', OnDocumentClick, false);

  document.onmouseup=function() { if(typeof(RichText_ElmSelected)!='undefined') RichText_UnselectRichElement(); }
}
window.setTimeout("InitSurveillanceGlobal();", 0);

// Raccourcie pour obtenir la valeur d'un noeud unique (avec ou sans CDATA)
// ///////////////////////////////////////////////////
function nodeVal(xml, node)
{ 
  if(xml==null) { alert(_('@Erreur : flux XML vide')+' ('+node+')'); return ''; }  // Renvoyer d'un string vide poutot qu'un null !!
  
  xml=xml.getElementsByTagName(node)[0];
  if(typeof xml!='object') { alert(_('@Erreur : node XML introuvable')+' ('+node+')'); return ''; }
  
  var data=(xml.firstChild!=null)?xml.firstChild.nodeValue:xml.nodeValue;
  
  return data?data:'';
}

// Requête Javascript Asynchrone (AJAX)
// ///////////////////////////////////////////////////
function RequeteServeur(href, param, fonctionRetour, method, asynchro, format)
{
   var xhr_object = null;  
   method=(method)?method.toLowerCase():"get";
   if(!format) format="text";
   
   if(window.XMLHttpRequest) xhr_object=new XMLHttpRequest();
   else if(window.ActiveXObject)
   {
	  xhr_object=new ActiveXObject("Msxml2.XMLHTTP");	
	  if(!xhr_object) xhr_object= new ActiveXObject("Microsoft.XMLHTTP");
   }   
   if(!xhr_object) { alert("e-site est incompatible avec votre navigateur !");  return; }
   
   if(method=="get") { href+="?"+param; param=null; }

   try
   {	   
	  xhr_object.onreadystatechange=function()
	  {
		  if(xhr_object.readyState==4 && fonctionRetour && xhr_object.status==200)
		      fonctionRetour( (format=="xml")?xhr_object.responseXML:xhr_object.responseText );
	  }
	  xhr_object.open(method.toUpperCase(), href, asynchro);	  
	  if(method=="post") xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

	  xhr_object.send(param);
	   
   } catch(errv) { alert("Erreur de connection au serveur : "+errv.message); }
}

// Retourne un formulaire complet
// ///////////////////////////////////////////////////
function getDataFromForm(Form)
{  
   Form=document.getElementById(Form);
   var data= new Array(); 
   var key=0;
   
   for (key=0; key<Form.elements.length; key++)
   {   
       switch(Form.elements[key].type)
	   {   
           case 'checkbox':
		      var currentValue = getValueFromChk(Form.elements[key]);   
              break;   
           case 'radio':
		      var currentValue = getValueFromChk(Form.elements[key]);   
              break;   
           default:
		      var currentValue = (Form.elements[key].tagName.toLowerCase()=="select")?getSelectValue(Form.elements[key]):Form.elements[key].value;   
              break;   
       }   
  
       if(currentValue!=undefined && currentValue!='')
		   data[key]=Form.elements[key].name+'='+rawUrlEncode(currentValue);
   }

   return data.join('&');
}

function getValueFromChk(obj)
{    
   return (obj.checked)?obj.value:''; 
}

function getSelectValue(select)
{     
   var value="";  
   
   for (var i=0; true; i++)
   {   
      if (select[i])
	  {
         if (select[i].selected) value += select[i].value + ",";   
		   
      } else return value.substr(0, value.length-1);    
   }    
} 

// Fonction manquante au lexique Javascript
// ///////////////////////////////////////////////////
function getElementsByClassName(oElm, strTagName, strClassName)
{
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	strClassName = strClassName.replace(/-/g, "\-");
	var oRegExp = new RegExp("(^|\s)" + strClassName + "(\s|$)");
	var oElement;
	for(var i=0; i<arrElements.length; i++){
		oElement = arrElements[i];
		if(oRegExp.test(oElement.className)){
			arrReturnElements.push(oElement);
		}
	}
	return (arrReturnElements)
}

// Ecriture/Lecture des cookies
// ///////////////////////////////////////////////////
function EcrireCookie(name, value, expires, path, domain, secure)
{
   var curCookie=name + "=" + escape(value) +
       ((expires) ? "; expires=" + expires.toGMTString() : "") +
	   ((path) ? "; path=" + path : "") +
	   ((domain) ? "; domain=" + domain : "") +
	   ((secure) ? "; secure" : "");
	  
   document.cookie= curCookie;	
}

function LireCookie(name)
{
   var dc=document.cookie;
   var prefix = name + "=";
   var begin=dc.indexOf("; "+ prefix);
   if(begin==-1)
   {
	  begin=dc.indexOf(prefix);   
	  if(begin!=0) return null;
   } else {
	  begin+=2;   
   }
   var end=document.cookie.indexOf(";", begin);
   if(end==-1) end=dc.length;
   return unescape(dc.substring(begin + prefix.length, end));
}

// Enregistrement/Lecture de la position de l'ascenceur
// ///////////////////////////////////////////////////
function saveScroll()
{
   var now=new Date();
   now.setTime(now.getTime()+365*24*60*60*1000);

   setCookie("position", bw.scrollTop(), now);
}

function loadScroll()
{
   var position = getCookie("position");
   if(!position) return;

   scrollTo(0, parseInt(position));	
}

// Version complète de la fonction escape
// ///////////////////////////////////////////////////
function rawUrlEncode(string)
{
   string=escape(string);
   
   string=string.replace(/\+/, "%2B");
   string=string.replace(/\//, "%2F");
   string=string.replace(/\@/, "%40");

   return string;
}